home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / util / boot / BlizKick.lha / BlizKick / BlizKick.ASM < prev    next >
Assembly Source File  |  2000-09-04  |  79KB  |  3,591 lines

  1. ; FILE: Source:BlizKick.ASM          REV: 497 --- BlizKick - the ultimate maprom tool
  2. ; History
  3. ;  1      Running OK!
  4. ;  15     Now BlizKick should work with all Blizzard turbos.
  5. ;  19     Now BlizKick should even support KS 1.0... (?)
  6. ;  25     Added LOCALFAST feature.
  7. ;  31     Added QUICKBOOT feature.
  8. ;  33     Added better Printf.
  9. ;  48     Added Better ROM identification code (checksum).
  10. ;  65     Added "real" cache clear routine.
  11. ;  69     Fixed _seek bug.
  12. ;  71     Fixed KS 1.3 SPEEDROM bug.
  13. ;  81     Replaced "execinit" patch with resident tag.
  14. ;  107    Fix for Blizzard 1260! 1230-IV too!!
  15. ;  111    Added original Kickstart restoration.
  16. ;  114    Implemented KS1.x KS restoration.
  17. ;  115    Improved error messages.
  18. ;  116    Improved MAPROM test and CacheClear routine.
  19. ;  125    Added HOGWAITBLIT feature.
  20. ;  129    Added SetPatch (680x0.library) check.
  21. ;  175    Added MODULE feature.
  22. ;  186    Added EXTRESBUF feature.
  23. ;  210    Added External patches and BKMF_ExtResBuf flag, fixed 1.x ROMTag support.
  24. ;  215    Fixed LOCALFAST feature not to force MEMF_LOCAL or MEMF_KICK!
  25. ;  220    Fixed KS 1.x ROMTag support.
  26. ;  225    Added special handling for 1230-IV and 1260. Fixed FORCE.
  27. ;  240    Removed need to be run before SetPatch on 1260 systems.
  28. ;  248    Can be used with Enforcer, CPU FASTROM, VMM etc.
  29. ;  257    Improved 040/060 cache flushing code. BlizKick release 1.6.
  30. ;  266    Fixed bug in 040/060 MMU test code.
  31. ;  276    Added XPK support.
  32. ;  277    Modified to work better with PowerPC... :)
  33. ;  279    Added better (Old)OpenLibrary code. Removed FindName() things.
  34. ;  289    Fixed XPK support.
  35. ;  293    Now will set memory node name if null.
  36. ;  300    Fixed EXTRESBUF.
  37. ;  302    Fixed negative return code bug.
  38. ;  307    Added ROM address validity test.
  39. ;  311    Fixed BLIZZARD 2060 code.
  40. ;  313    Fixed one terrible bug from B2060 code.
  41. ;  328    Fixing EXTRESBUF...
  42. ;  332    Finished! Now it should work with 1260, 2040 and 2060.
  43. ;  338    DOES work on 1260. Fixed one minor bug. SoftSCSI module doesn't work.
  44. ;  340    Added memheader move code to LOCALFAST. -> Speed AllocMem()
  45. ;  343    Fixed reset code!
  46. ;  344    Allowed BlizKick to kick same kickfile and rom chip version.
  47. ;  348    Fixed .testblizppcrunnommu. Added pseudofile (*) feature.
  48. ;  353    Added LastPatches (fix for MEMF_REVERSE svstack, etc.)
  49. ;  361    Fixed svstack trash, disabled SVSTACKTRASH.
  50. ;  377    Added QUIET switch, fixed LastPatches, KS 33.180 works now!
  51. ;  388    Got KS 33.180 finally work 100%.
  52. ;  389    Added handling for BKMODPATH env variable.
  53. ;  399    Improved HOGWAITBLIT.
  54. ;  400    Found out that 2040 and 2060 boards are almost identical.
  55. ;  403    Fixed reset code to *disable* caches.
  56. ;  404    1.11ß1: Trying to get EXTRESBUF into fastmem.
  57. ;  412    Did it. Seems to work 100%.
  58. ;  415    Fixed MAPROM test. Now should detect if MAPROM not set.
  59. ;  416    Disabled SUPERVISOR_NOREVERSE from LastPatches.
  60. ;  421    Added support for (A4000?) CPU Cards.
  61. ;  425    Now KS 1.x are only patched if they're original versions. This should
  62. ;         prevent problems with some patches 1.x ROM images.
  63. ;  426    Fixed bug in ROM image validation test.
  64. ;  427    9th Dec 1997: ARGH! Wrote nice CPUCard support but forgot to enable
  65. ;         it!!! ;-)
  66. ;  429    Added support for Cyberstorm PPC and MKIII. Now should work at least
  67. ;         with CBM CPU Cards, Cyberstorm MKI, MKIII and PPC.
  68. ;  439    Separated A1200 and other model's check routines. Hopefully fixed CS
  69. ;         MKIII/PPC support. Added CS MKII support. Now CPUCARD is only meant to
  70. ;         be used with CS MKI & compatible.
  71. ;  442    Fixed few typos etc.
  72. ;  443    Fixed stupid BUG from CS support... THANKS DUKEN!! =)
  73. ;  444    Had mixed 20x0 and CS MK II product IDs... doh! Thanks shido at #amiga!
  74. ;  445    Fixed some Lock bugs.
  75. ;  446    13th May 1998 Made the source public in hope someone would continue the
  76. ;         development.
  77. ;  450    6th July 1998 Added Blizzard PPC support.
  78. ;  458    8th July 1998 Fixed Blizzard PPC and CS MKII support (I hope).
  79. ;  459    17th July 1998 Fixed stupid bug from CS MKII support.
  80. ;  461    4th October 1998 Finally fixed the blizz ppc bug. hehe.
  81. ;  462    6th October 1998 Fixed support for old KS.
  82. ;  463    9th October 1998 Fixed MK2 bug. Ta ChaoZer.
  83. ;  464    13th October 1998 Another MK2 fix <sigh>. Ta ChaoZer.
  84. ;  467    3rd November 1998 Disabled rom checksum disable in SPEEDROM.
  85. ;  468    24th January 1999 Fixed stupid blizzppc (and probably CSPPC too)
  86. ;         bug, blizzppc/csppc kernel overwrote EXTRES buffer. Now allocates
  87. ;         1mb extra memory. froze 1.18.
  88. ;  469    7th November 1999 Made BlizKick use fastmem hunks again. Finally
  89. ;         made it possible to `FORCE-after-maprom-is-already-active' and remove
  90. ;         maprom for Blizzard PPC.
  91. ;  470    Implemented new straightforward method to solve BKMODPATH variable
  92. ;         in DoPlanting routine.
  93. ;  471    Doesn't Delay(25) if QUIET is specified.
  94. ;  472    Added 040/060 move16 optimized copymem256.
  95. ;  473    Sped up FindResident and resident module reconnect. froze 1.19.
  96. ;  474    7th Jan 2000: Bumped revision strings to 1.20.
  97. ;  475    8th Jan 2000: Fixed major memory loss on extresbuf Deallocate on error
  98. ;         condition. Also that Deallocate() call wasn't called in Forbid state.
  99. ;  476    9th Jan 2000: New feature: you can give *any* loadsegable executable
  100. ;         as module. Resident modules inside will be initialized. Cool. Renders
  101. ;         SCSIDEV43 module obsolete, just give devs:scsi43.device as one module!
  102. ;         You can also give l:fastfilesystem etc! wooow, this is WAY too cool. :)
  103. ;         This required a change in the internal way of handling EXTRES buffer
  104. ;         + some new InternalLoadSeg code.
  105. ;  477    Now uses move.l an,an as nop when possible. FindResident bugged, it
  106. ;         scanned ROM first, then EXTRES buffer. Fixed to be opposite.
  107. ;  478    Added mmu.library support to getmmu and runnommu routine. This is a
  108. ;         "good thing"(TM).
  109. ;  479    14th Jan 2000: LOCALFAST and QUICKBOOT are now finally gone. Arguments
  110. ;         are there, but do nothing. Now the good news: Finally cleaned up the
  111. ;         code, and changed EXTRES buffer attaching to ROM such way it finally
  112. ;         works everytime on blizzppc. Yes! Added new argument SANITY/K/N to
  113. ;         specify sanity added to EXTRES buffer allocation in kbytes. PoolMem
  114. ;         could have fucked BlizKick in several ways, it changes MemHeaders on
  115. ;         the fly... Fixed. froze 1.20.
  116. ;  480    17th Jan 2000: *MAJOR BUG*: move16 could have easily got source
  117. ;         aligned by only 8 causing copy source shifted by 8 bytes -> non
  118. ;         working rom image. *THIS* has caused all these weird crashed with
  119. ;         different EXTRESBUF sizes. Me & my ultrafast copyloop. Duh! :(
  120. ;         Now uses *only* movem copy.
  121. ;  481    Wrote separate LocalFast module so removed ARG_LOCALFAST completely.
  122. ;         exe module support didn't set error code properly when out of EXTRES
  123. ;         buffer memory. Accidently called dos.library/Open for _gettc when
  124. ;         exec.library/Supervisor should have been called. Fun thing is that
  125. ;         this had so side effects. :) froze 1.21.
  126. ;  482    29th Jan: Fixed some nastiness from Blizzard 1230 maprom .testcode,
  127. ;         dunno if this fixes anything, but anyway it was bugged. mmu.library
  128. ;         getmmu was bugged: it always thought machine had 030 compatible MMU,
  129. ;         this didn't cause any problems though, but was wrong. Oops, stupid
  130. ;         bug in MK2 support, blo instead of bhi. Also 20x0 support could have
  131. ;         been affected. froze 1.22beta1.
  132. ;  483    31th Jan: removed CPU Card test code, I think it prevented it from
  133. ;         working, I hope. froze 1.22beta2.
  134. ;  484    3rd Feb: CS MK II works now, but BlizKick didn't recognize if it was
  135. ;         run before. Tweaked check code to run MMU disabled, see _checkactive.
  136. ;         froze 1.22beta3.
  137. ;  485    24th Feb: Disabled memory header name checks, should now work better
  138. ;         if memory node name is fucked. Fixed LocalFast module, it was kindof
  139. ;         broken. froze 1.22beta4.
  140. ;  486    my BK_MOD macro was fucked in previous release. damn! :(
  141. ;         froze 1.22beta5.
  142. ;  487    6th Mar: InstallModule BKMB_SingleMode misbehaved if module was
  143. ;         already installed. fixed. Forgot to remove LOCALFAST commandline
  144. ;         argument when I wrote LocalFast module. fixed. froze 1.22beta7.
  145. ;  488    7th Mar: Removed _regtemp stuff as mmu.library WithoutMMU passes
  146. ;         registers around. Rewrote runnommu, adding transparent translation
  147. ;         disable for 68030/68040/68060 and proper ATC cache flushing for
  148. ;         68030. Now BlizKick checks for activity first MMU enabled then MMU
  149. ;         disabled. Added elfloadseg-patch ioerr bug workaround, now you get
  150. ;         proper error message when module is not found. Added 256k ROM
  151. ;         support for CPU Cards. froze 1.22beta8.
  152. ;  489    27th Mar: oops, the new 030 runnommu accidently did rts instead of
  153. ;         rte. Definetely broke BlizKick on 030 machines. froze 1.22beta10.
  154. ;  490    28th Apr: No longer tries to open mmu.library if run before
  155. ;         SetPatch. froze 1.22beta11.
  156. ;  491    1st Aug: Bugfix: the 040+ cacheclear routine didn't invalidate the
  157. ;         data and inst cache after flush. froze 1.22beta12.
  158. ;  492    4th Aug: Bugfix: Terrible horrible stupid "nggh ngggh!" -level bug
  159. ;         fixed from 020/030 MMU test code, it fucked up VBR completely! Many
  160. ;         thanks go to "John Stunner" who found this and reported it at
  161. ;         ru.amiga 2nd Aug. Also special thanks to Useless who redirected this
  162. ;         message to me 3rd Aug. This bug was very evil as it fucked up ALL
  163. ;         exception vectors in VBR, every time BlizKick was run. So it made
  164. ;         030 systems very unstable... oh my god! ;) froze 1.22beta13.
  165. ;  493    6th Aug: Fixes to DisableCacheS: now invalidate cache on 040/060.
  166. ;         Made disable 060 superscalar dispatch. froze 1.22beta14.
  167. ;  494    7th Aug: Finally found the reason for CS MK II
  168. ;         'Kickstart wasn't kicked using BlizKick!' -error. When _restore check
  169. ;         failed it fell thru to this error message. Now has special error
  170. ;         message 'Kickstart restoring not supported!' for this case. Should
  171. ;         finally work fine on CS MK II. Now will quit quietly (RC = WARN) if
  172. ;         MorphOS is running. froze 1.22beta15.
  173. ;  495    10th Aug: PutResident RTF_AUTOINIT support was a bit broken. Never
  174. ;         really used so was harmful. 15th Aug: Improved 030 runnommu not to
  175. ;         mess with mmu registers if mmu seems to be disabled already.
  176. ;  496    2nd Sep: froze 1.22.
  177. ;  497    4th Sep: Fixed silly bug from 030 MMU code, wrong stack offset was
  178. ;         used for restoring TC in runnommu (Remco Komduur).
  179. ;
  180.  
  181. ;DEBUGMODE    EQU    1        ;don't clone code
  182.  
  183. ;
  184. ; I seriously doubt if this source code is useful for anything else.
  185. ; Hairy code everywhere, this one is really a bitch to maintain...
  186. ;
  187.  
  188. ; TODO (err, not never, maybe, huh)
  189. ; o total rewrite in C (btw is currently in progress ;-)
  190. ; o unused romtag zapper & support for this extra space to FindSpace.
  191. ;   also add this functionality to applypatch
  192. ; o BootControl module. Maybe. Requested by several users.
  193. ; o Test/Fix CS MK I and A4000 CPU card support, if only possible.
  194. ; o ROM checksum (restore orig rom if bad ROM checksum)
  195. ; o OxyPatcher module (doubt it, Oxy is dead)
  196. ; o possibility to get commandline arguments from a file
  197. ;   (can be emulated with `BlizKick ? <cmd_file')
  198. ; o module memory requirements inside the module itself ('$LEN: 280' ?) ?
  199. ;
  200.  
  201. USE_STD_INCLUDES    SET    1
  202.     IFNE    USE_STD_INCLUDES
  203.     MACHINE    MC68040
  204.     include    "exec/types.i"
  205.     include    "exec/nodes.i"
  206.     include    "exec/libraries.i"
  207.     include    "exec/memory.i"
  208.     include    "exec/execbase.i"
  209.     include    "exec/resident.i"
  210.     include    "exec/alerts.i"
  211.     include    "exec/semaphores.i"
  212.     include    "dos/dos.i"
  213.     include    "exec/exec_lib.i"
  214.     include    "dos/dos_lib.i"
  215.     include    "graphics/gfxbase.i"
  216.     include    "graphics/graphics_lib.i"
  217. call    MACRO
  218.     jsr    (_LVO\1,a6)
  219.     ENDM
  220.     ELSE
  221.     include    "Devpac:Gen.gs"
  222.     ENDC
  223.     include    "dos/dosextens.i"
  224.     include    "libraries/configvars.i"
  225.     include    "libraries/expansion_lib.i"
  226.     include    "hardware/dmabits.i"
  227.     include    "hardware/custom.i"
  228.  
  229.     include    "libraries/xpk.i"    ; from xpk_dev
  230.  
  231.     include    "blizkickmodule.i"
  232.  
  233.  
  234. ; mmu.library LVOs
  235.     IFND    _LVOGetMMUType
  236. _LVOGetMMUType    EQU    -$36
  237. _LVOWithoutMMU    EQU    -$10E
  238.     ENDC
  239.  
  240.     IFND    MUTYPE_NONE
  241. MUTYPE_NONE     equ     0
  242. MUTYPE_68851    equ     '2'
  243. MUTYPE_68030    equ     '3'
  244. MUTYPE_68040    equ     '4'
  245. MUTYPE_68060    equ     '6'
  246.     ENDC
  247.  
  248. ; PoolMem uses this to indicate small pool MemHeader.
  249. ; We don't want to get EXTRES buffer memory from such mem...
  250.     BITDEF    MEM,POOLMEM,4
  251.  
  252.  
  253. ARG_KICKFILE    EQU    0
  254. ARG_MODULE    EQU    4
  255. ARG_EXTRESBUF    EQU    8
  256. ARG_SANITY    EQU    12
  257. ARG_FORCE    EQU    16
  258. ARG_SPEEDROM    EQU    20
  259. ARG_HOGWAITBLIT    EQU    24
  260. ARG_CPUCARD    EQU    28
  261. ARG_QUIET    EQU    32
  262.  
  263. BLIZPROD    EQU    $2140
  264. ROMSUMOFFS    EQU    -$18
  265. ROMSIZEOFFS    EQU    -$14
  266. IDOFFS    EQU    -$10
  267. BLIZKICK_ID    EQU    'BlzK'
  268. DEF_SANITY    EQU    32        ;default allocation sanity buffer, 32k
  269.  
  270. HAVE_SPEEDROMCHECKSUM    EQU    0    ;1 = disable rom checksum on SPEEDROM
  271. HAVE_NEW_ENV_METHOD    EQU    1    ;1 = use new BKMODPATH solve routine
  272. HAVE_CHECKCPUCARD    EQU    0    ;1 = use CheckCPUCard
  273.  
  274. CACHEFLUSH040    MACRO
  275.     dc.w    $F478        ; CPUSHA BC    flush the data into memory
  276.     dc.w    $F4D8        ; INVA    BC    invalidate the data and inst caches
  277.     dc.w    $4E71        ; nop
  278.     ENDM
  279.  
  280. FULLFLUSH040    MACRO
  281.     dc.w    $F478        ; CPUSHA BC    flush the data into memory
  282.     dc.w    $F4D8        ; INVA    BC    invalidate the data and inst caches
  283.     dc.w    $F518        ; PFLUSHA    flush the address translation cache
  284.     dc.w    $4E71        ; nop
  285.     ENDM
  286.  
  287.  
  288.     SECTION    CODE,CODE
  289.  
  290. Main    move.l    a0,a2
  291.     move.l    d0,d2
  292.     move.l    (4).w,a6
  293.  
  294.     lea    (morphosname,pc),a1
  295.     call    Forbid
  296.     call    FindResident
  297.     move.l    d0,d3
  298.     lea    (setpatchname,pc),a1
  299.     call    FindSemaphore
  300.     call    Permit
  301.     tst.l    d3
  302.     beq.b    .no_morphos
  303.     ; quietly quit if MorphOS...
  304.     moveq    #RETURN_WARN,d0
  305.     rts
  306. .no_morphos
  307.     ; NOTE: must use d0 for this coz else .dont_try craps!
  308.     tst.l    d0
  309.     beq.b    .dont_try
  310.     lea    (mmuname,pc),a1
  311.     moveq    #41,d0
  312.     bsr    OpenLib
  313. .dont_try    lea    (_mmubase,pc),a0
  314.     move.l    d0,(a0)
  315.  
  316.     lea    (_ExecBase,pc),a0
  317.     move.l    a6,(a0)
  318.     lea    (_AttnFlags,pc),a0
  319.     move.w    (AttnFlags,a6),(a0)
  320.  
  321.     IFGT    0
  322.     btst    #AFB_68040,(_AttnFlags+1,pc)
  323.     bne.b    .has_040
  324.     lea    (copymem256,pc),a0
  325.     move.w    #$6000|(copymem256_000-copymem256-2),(a0)
  326. .has_040
  327.     ENDC
  328.  
  329.     moveq    #RETURN_FAIL,d7
  330.  
  331.     IFD    DEBUGMODE
  332.     bsr    CacheClearOS
  333.     ELSE
  334.     move.l    #CODE_SIZEOF,d0
  335.     move.l    #MEMF_PUBLIC,d1
  336.     call    AllocMem
  337.     lea    (_Self,pc),a0
  338.     move.l    d0,(a0)
  339.     beq    .exit
  340.  
  341.     move.l    d0,a1
  342.     pea    (.jmpdest-Main,a1)
  343.     pea    (CacheClearOS,pc)
  344.     lea    (Main,pc),a0
  345.     move.l    #CODE_SIZEOF,d0
  346.     jmp    (_LVOCopyMemQuick,a6)
  347. .jmpdest
  348.     ENDC
  349.  
  350.     lea    (DosName,pc),a1
  351.     moveq    #33,d0
  352.     bsr    OpenLib
  353.     move.l    d0,d6
  354.     beq    .exit
  355.     move.l    d0,a6
  356.  
  357.     moveq    #0,d4            Set default!!
  358.  
  359.     cmp.w    #37,(LIB_VERSION,a6)
  360.     shs    d5
  361.  
  362.     bsr    getmmu
  363.     lea    (_mmuflag,pc),a0
  364.     move.b    d0,(a0)
  365.     beq.b    .nommu
  366.  
  367.     btst    #AFB_68040,(_AttnFlags+1,pc)
  368.     beq.b    .nommu
  369.     ; oops, used to call dos.library/Open() instead ;)
  370.     move.l    (_ExecBase,pc),a6
  371.     lea    (_gettc,pc),a5
  372.     call    Supervisor
  373.     lea    (_tc,pc),a0
  374.     move.l    d0,(a0)
  375.     move.l    d6,a6
  376. .nommu
  377.  
  378.     lea    (_Array,pc),a3
  379.     tst.b    d5
  380.     bne.b    .ks20
  381.     clr.l    -1(a2,d2.l)
  382.     subq.l    #1,d2
  383.     beq.b    .do            RESTORE!
  384.     move.l    a2,(a3)
  385.     lea    (_13Help,pc),a0
  386.     cmp.b    #'?',(a2)
  387.     bne.b    .do
  388.     subq.l    #1,d2
  389.     beq    .printmsgexit
  390.     bra.b    .do
  391. .ks20    lea    (_Template,pc),a0
  392.     move.l    a0,d1
  393.     move.l    a3,d2
  394.     moveq    #0,d3
  395.     call    ReadArgs
  396.     move.l    d0,d4
  397.     beq    .badargs
  398.  
  399. .do
  400.     lea    (_Quiet,pc),a0
  401.     move.l    (ARG_QUIET,a3),(a0)
  402.  
  403.     tst.l    (ARG_CPUCARD,a3)
  404.     beq.b    .no_cpucard
  405.     IFEQ    HAVE_CHECKCPUCARD
  406.     lea    (_CPUCard,pc),a0
  407.     st    (a0)
  408.     bra.b    .has_cpucard
  409.     ELSE
  410.     bsr    CheckCPUCard
  411.     lea    (_CPUCard,pc),a0
  412.     move.b    d0,(a0)
  413.     bne.b    .has_cpucard
  414.     lea    (NoCPUCard,pc),a0
  415.     bra.b    .printmsgexit
  416.     ENDC
  417. .no_cpucard
  418.  
  419.     bsr    TestBliz
  420.     lea    (RequiresBliz,pc),a0
  421.     lea    (_BlizROM,pc),a1
  422.     move.l    d0,(a1)
  423.     beq.b    .printmsgexit
  424. .has_cpucard
  425.  
  426.     movem.l    d4-d6/a6,-(sp)
  427.     moveq    #RETURN_ERROR,d7
  428.     lea    (Messu,pc),a0
  429.     bsr    _PrintHeaderf
  430.     bsr    _HeadMain
  431.     movem.l    (sp)+,d4-d6/a6
  432.  
  433. .freeargs    tst.b    d5
  434.     beq.b    .closedos
  435.     move.l    d4,d1
  436.     call    FreeArgs
  437. .closedos    move.l    d6,a1
  438.     move.l    (_ExecBase,pc),a6
  439.     call    CloseLibrary
  440. .exit
  441.  
  442.     move.l    (_mmubase,pc),d0
  443.     beq.b    .nommulib
  444.     move.l    d0,a1
  445.     call    CloseLibrary
  446. .nommulib
  447.     move.l    (_Self,pc),d0
  448.     beq.b    .nocopy
  449.     move.l    d0,a1
  450.     move.l    #CODE_SIZEOF,d0
  451.     call    Forbid            Make sure we have time to execute
  452.     call    FreeMem            the rest...
  453. .nocopy    move.l    d7,d0
  454.     rts
  455.  
  456. .printmsgexit    bsr    _PrintHeaderf
  457.     bra.b    .freeargs
  458.  
  459. .badargs    bsr.b    _PrintFault        IN: d5=kickflag, d6=dosbase
  460.     bra.b    .closedos
  461.  
  462.  
  463. ;  IN: d5=kickflag, d6=dosbase
  464. ; OUT: Fault printed
  465. _PrintFault    movem.l    d0-d2/a0-a1/a6,-(sp)
  466.     move.l    (_Quiet,pc),d0
  467.     bne.b    .exit
  468.     move.l    d6,a6
  469.     call    IoErr
  470.     tst.b    d5
  471.     beq.b    .oldie
  472.     move.l    d0,d1
  473.     moveq    #0,d2
  474.     call    PrintFault
  475. .exit    movem.l    (sp)+,d0-d2/a0-a1/a6
  476.     rts
  477.  
  478. .oldie    move.l    d0,-(sp)
  479.     beq.b    .noerr
  480.     lea    (_ks13error,pc),a0
  481.     move.l    sp,a1
  482.     bsr    _Printf
  483. .noerr    addq.l    #4,sp
  484.     bra.b    .exit
  485.  
  486.  
  487. ;  IN: A0=FmtString, A1=Array, a2=Buffer
  488. ; OUT: Formatted text
  489. _Sprintf    movem.l    d0-d1/a0-a3/a6,-(sp)
  490.     move.l    a2,a3
  491.     lea    (.putchar,pc),a2
  492.     move.l    (_ExecBase,pc),a6
  493.     call    RawDoFmt
  494.     movem.l    (sp)+,d0-d1/a0-a3/a6
  495.     rts
  496. .putchar    move.b    d0,(a3)+
  497.     rts
  498.  
  499.  
  500. ;  IN: A0=FmtString, A1=Array, d6=dosbase
  501. ; OUT: Printed text, including program info header
  502. _PrintHeaderf    movem.l    d0-d1/a0-a2/a6,-(sp)
  503.     move.l    (_ExecBase,pc),a6
  504.     move.l    #$10000,d0        ; Allocate 64k buffer
  505.     moveq    #MEMF_ANY,d1
  506.     call    AllocMem
  507.     move.l    d0,-(sp)
  508.     beq.b    .nomem
  509.     movem.l    (3*4,sp),a0-a1
  510.     move.l    (sp),a2
  511.     bsr.b    _Sprintf
  512.     pea    (_Copyright,pc)
  513.     pea    (_Version,pc)
  514.     lea    (.header,pc),a0
  515.     move.l    sp,a1
  516.     bsr.b    _Printf
  517.     addq.l    #8,sp
  518. .nomem    move.l    (sp)+,d0
  519.     beq.b    .exit
  520.     move.l    d0,a1
  521.     move.l    #$10000,d0
  522.     call    FreeMem
  523. .exit    movem.l    (sp)+,d0-d1/a0-a2/a6
  524.     rts
  525. .header    dc.b    $9B,'1;32m%s',$9B,'31m %s.',$9B,'0m',10
  526.     dc.b    '%s',0
  527.     CNOP    0,2
  528.  
  529.  
  530.     STRUCTURE pf_data,0
  531.     APTR    pfd_DosBase
  532.     APTR    pfd_Count
  533.     STRUCT    pfd_Buffer,256
  534.     LABEL    pf_data_SIZEOF
  535.  
  536.     CNOP    0,4
  537. ;;_OutputFH    dc.l    0
  538. ;  IN: A0=FmtString, A1=Array (may be 0), d6=dosbase
  539. ; OUT: Printed text
  540. _Printf
  541. Printf    movem.l    a0-a3/a6/d0-d3,-(sp)
  542.     move.l    (_Quiet,pc),d0
  543.     bne.b    .exit
  544.     lea    (-pf_data_SIZEOF,sp),sp
  545.     move.l    sp,a3
  546.     move.l    d6,(a3)+
  547.     clr.l    (a3)+
  548.     lea    (.newchar,pc),a2
  549.     move.l    (_ExecBase,pc),a6
  550.     call    RawDoFmt
  551.     move.l    d6,a6
  552.     IFD    _OutputFH
  553.     move.l    _OutputFH,d1
  554.     ELSE
  555.     call    Output
  556.     move.l    d0,d1
  557.     ENDC
  558.     move.l    a3,d2
  559.     move.l    (-4,a3),d3
  560.     call    Write
  561.     lea    (pf_data_SIZEOF,sp),sp
  562. .exit    movem.l    (sp)+,a0-a3/a6/d0-d3
  563.     rts
  564. .newchar    movem.l    d0-d3/a0-a1/a3/a6,-(sp)
  565.     move.l    a3,d2                for Write()
  566.     move.l    -(a3),d1
  567.     move.b    d0,4(a3,d1.l)
  568.     addq.b    #1,d1
  569.     move.l    d1,(a3)
  570.     bne.b    .dont_print
  571.     move.l    -(a3),a6
  572.     IFD    _OutputFH
  573.     move.l    _OutputFH,d1
  574.     ELSE
  575.     call    Output
  576.     move.l    d0,d1
  577.     ENDC
  578.     move.l    #256,d3
  579.     call    Write
  580. .dont_print    movem.l    (sp)+,d0-d3/a0-a1/a3/a6
  581.     rts
  582.  
  583.  
  584. ;  IN: d6=dosbase, *must* remain if you're going to call internal _xxx functions
  585. ;      a3=paramarray, is zero if null template, scratch
  586. ;      a6=dosbase, scratch
  587. ; OUT: d7=return code
  588. _HeadMain
  589.     bsr    _checkactive
  590.     move.b    d0,d2
  591.     beq.b    .isactive
  592.     lea    (_checkactive,pc),a0
  593.     bsr    runnommu
  594.     move.b    d0,d2            keep this flag for a while
  595. .isactive
  596.  
  597.     tst.l    (a3)            (ARG_KICKFILE,a3)
  598.     bne.b    .norestore
  599.  
  600.     tst.b    d2
  601.     bne.b    .notactive
  602.     lea    (_restore,pc),a0
  603.     bsr    runnommu
  604.     bne    KickSys
  605.  
  606.     lea    (NoRestore,pc),a0
  607.     bra    _Printf
  608. .notactive
  609.     lea    (NoRem,pc),a0
  610.     bra    _Printf
  611. .norestore
  612.  
  613.     moveq    #0,d1            !!
  614.     bsr    SetIoErr
  615.  
  616.     tst.l    (ARG_FORCE,a3)
  617.     bne.b    .force1
  618.  
  619.     moveq    #RETURN_WARN,d7
  620.     tst.b    d2
  621.     beq    .exit            Already kicked!
  622.  
  623.     moveq    #RETURN_ERROR,d7
  624.  
  625. .force1    move.l    (a3),a0            (ARG_KICKFILE,a3),a0
  626.     cmp.b    #'*',(a0)
  627.     bne.b    .not_pseudofile
  628.     tst.b    (1,a0)
  629.     bne.b    .not_pseudofile
  630.  
  631.     ; Handle "*" -file:
  632.     tst.b    d2            Test for kicked ROM.
  633.     beq    .exit            Already kicked!
  634.     lea    $01000000+IDOFFS,a4    Will fail if kicked previously!
  635.     move.l    -(a4),d3        a4=$01000000+ROMSIZEOFFS
  636.     move.l    d3,d0
  637.     moveq    #MEMF_PUBLIC,d1
  638.     move.l    (_ExecBase,pc),a6
  639.     call    AllocMem
  640.     tst.l    d0
  641.     beq    .exit
  642.     move.l    a4,a0
  643.     sub.l    d3,a0
  644.     add.w    #-ROMSIZEOFFS,a0
  645.     move.l    d0,a4
  646.     move.l    a4,a1
  647.     move.l    d3,d0
  648.     call    CopyMemQuick
  649.     move.l    d3,d1
  650.     move.l    d3,d4
  651.     bra.b    .cont_pseudo
  652.  
  653. .not_pseudofile
  654.     bsr    XPKLoad
  655.     beq    .exit
  656.     move.l    a1,a4
  657.     move.l    d1,d3
  658.     move.l    d0,d4
  659.  
  660. .cont_pseudo    and.l    #$FFF3FFFF,d1        256K or 512K ROM
  661.     bne    .free
  662.     cmp.l    #$00080000,d3
  663.     bhi    .free
  664.     lea    ROMSUMOFFS(a4,d3.l),a5
  665.     cmp.l    (4,a5),d3        Compare to romsize
  666.     bne    .free
  667.  
  668.     move.l    (a4),d2
  669.     and.l    #$FFF8FFFF,d2
  670.     cmp.l    #$11104EF9,d2
  671.     bne    .free
  672.     move.l    (4,a4),d2        Test for relocated ROM
  673.     add.l    d3,d2
  674.     swap    d2
  675.     cmp.w    #$0100,d2
  676.     bne    .free
  677.  
  678.     move.l    a4,a0            Get original ROM checksum
  679.     move.l    d3,d0
  680.     bsr    ROMReSum
  681.     lea    (_OrigSum,pc),a0
  682.     move.l    d0,(a0)
  683.  
  684.     movem.l    ($C,a4),d0/d1        Fix for old KS
  685.     addq.l    #1,d0
  686.     bne.b    .nofix
  687.     move.l    d1,($C,a4)
  688. .nofix
  689.     tst.l    (ARG_FORCE,a3)
  690.     bne.b    .force2
  691.  
  692.     moveq    #RETURN_WARN,d7
  693.     lea    $01000000,a1
  694.     move.l    a1,a0
  695.     sub.l    (ROMSIZEOFFS,a0),a0
  696.     move.l    ($C,a0),d0        Test for different version.
  697.     cmp.l    ($C,a4),d0
  698.     bne.b    .kick
  699.  
  700.     cmp.l    #BLIZKICK_ID,(8,a5)    Test for kicked file.
  701.     beq.b    .free
  702.  
  703. .kick    moveq    #RETURN_ERROR,d7
  704. .force2
  705.     move.l    (_Quiet,pc),d0
  706.     bne.b    .no_output
  707.     lea    (Messu2,pc),a0
  708.     lea    ($C,a4),a1
  709.     bsr    _Printf
  710.     move.l    d6,a6
  711.     moveq    #25,d1
  712.     call    Delay
  713. .no_output
  714.     bsr.b    GoForIt
  715.  
  716. .free    move.l    (_ExecBase,pc),a6
  717.     move.l    a4,a1
  718.     move.l    d4,d0
  719.     call    FreeMem
  720.  
  721. .exit    tst.l    d7
  722.     bmi.b    .nexitok
  723.     beq.b    .exitok
  724.     bsr    _PrintFault        IN: d5=kickflag, d6=dosbase
  725.     lea    (Already,pc),a0
  726.     cmp.w    #RETURN_WARN,d7
  727.     beq.b    .thiserr
  728.     lea    (CouldNotKick,pc),a0
  729. .thiserr    move.l    a3,a1
  730.     bra    _Printf
  731. .nexitok    neg.l    d7            result IN d7!!
  732. .exitok    rts
  733.  
  734.  
  735.  
  736. GoForIt    ;illegal
  737.  
  738.     neg.l    d7
  739.     move.l    (_ExecBase,pc),a6
  740.  
  741.     move.l    (ARG_EXTRESBUF,a3),d0
  742.     beq.b    .no_extbuf
  743.     move.l    d0,a0
  744.     move.l    (a0),d1
  745.  
  746.     move.l    #DEF_SANITY,d2
  747.     move.l    (ARG_SANITY,a3),d0
  748.     beq.b    .nosanity
  749.     move.l    d0,a0
  750.     move.l    (a0),d2
  751. .nosanity    lsl.l    #8,d2
  752.     lsl.l    #2,d2            *1024
  753.  
  754.     move.l    a4,a0
  755.     move.l    d3,d0
  756.     bsr    ExtResBuf
  757.     bne.b    .got_extbuf
  758.     bsr    _PrintFault        IN: d5=kickflag, d6=dosbase
  759.     bra.b    .fail
  760. .got_extbuf
  761. .no_extbuf
  762.     tst.l    (ARG_HOGWAITBLIT,a3)
  763.     beq.b    .no_agawblit
  764.     move.l    a4,a0
  765.     move.l    d3,d0
  766.     bsr    PutHogWaitBlit
  767. .no_agawblit
  768.     move.l    a4,a0
  769.     move.l    d3,d0
  770.     bsr    DoPlanting
  771.     beq.b    .fail
  772.  
  773.     tst.l    (ARG_SPEEDROM,a3)
  774.     beq.b    .no_patch2
  775.     move.l    a4,a0
  776.     move.l    d3,d0
  777.     bsr    SpeedROM
  778. .no_patch2
  779.  
  780.     move.l    a4,a0
  781.     move.l    d3,d0
  782.     bsr    LastPatches
  783.  
  784.  
  785.     move.l    #BLIZKICK_ID,IDOFFS(a4,d3.l)
  786.     move.l    a4,a0
  787.     move.l    d3,d0
  788.     bsr.b    ROMReSum
  789.     move.l    d0,ROMSUMOFFS(a4,d3.l)
  790.     bsr    CacheClearOS
  791.  
  792.     bsr    KickSys
  793. .fail
  794.  
  795. ;;    bra    FreeExtResBuf
  796.  
  797. ;  IN: a6=execbase
  798. ; OUT: d0/d1/a0/a1 trashed
  799. FreeExtResBuf
  800.     move.l    (_erh_freeaddr,pc),d0
  801.     beq.b    .xit
  802.     move.l    d0,a1
  803.     move.b    (_MemHeaderFlag,pc),d1
  804.     beq.b    .xit
  805.     call    Forbid
  806.     lea    (_memhead,pc),a0
  807.     bsr    FindMemHeader
  808.     beq.b    .cantfind
  809.     move.l    (_erh_alloclen,pc),d0
  810.     call    Deallocate
  811. .cantfind    call    Permit
  812.     lea    (_erh_freeaddr,pc),a0
  813.     clr.l    (a0)
  814. .xit    rts
  815.  
  816.  
  817. ROMReSum    move.l    d0,d1
  818.     lsr.l    #2,d1
  819.     move.l    ROMSUMOFFS(a0,d0.l),d0
  820.     not.l    d0
  821. .loop    add.l    (a0)+,d0
  822.     bcc.b    .skip
  823.     addq.l    #1,d0
  824. .skip    subq.l    #1,d1
  825.     bne.b    .loop
  826.     not.l    d0
  827.     rts
  828.  
  829.  
  830.  
  831.     ; Test for kicked ROM:
  832. _checkactive    cmp.l    #BLIZKICK_ID,$01000000+IDOFFS
  833.     sne    d0
  834.     rts
  835.  
  836.  
  837. _restore    lea    $0B80000,a4        Magic address!
  838.     move.l    (ROMSIZEOFFS,a4),d3
  839.     move.l    d3,d0
  840.     and.l    #$FFF3FFFF,d0        256K or 512K ROM
  841.     bne.b    .exitrts
  842.     cmp.l    #$00080000,d3
  843.     bhi.b    .exitrts
  844.     sub.l    d3,a4
  845.  
  846.     ; sanity check...
  847.     move.l    (a4),d0
  848.     and.l    #$FFF8FFFF,d0
  849.     cmp.l    #$11104EF9,d0
  850.     bne.b    .exitrts
  851.  
  852.     moveq    #1,d0
  853.     rts
  854. .exitrts    moveq    #0,d0
  855.     rts
  856.  
  857.  
  858. ;  IN: -
  859. ; OUT: d0=0 if no mmu, -1 if 040/060 mmu, 1 if 030/851 MMU.
  860. getmmu    movem.l    d1-a6,-(sp)
  861.     moveq    #0,d7
  862.  
  863.     move.l    (_mmubase,pc),d0
  864.     bne.b    .use_mmulib
  865.  
  866.     move.l    (_ExecBase,pc),a6
  867.     move.w    (AttnFlags,a6),d0
  868.     btst    #AFB_68020,d0
  869.     beq.b    .exit
  870.     cmp.w    #37,(LIB_VERSION,a6)
  871.     blo.b    .oldtest
  872.  
  873.     moveq    #-1,d7
  874.     lea    (.test040plus,pc),a5
  875.     btst    #AFB_68040,d0
  876.     bne.b    .test
  877. .oldtest    moveq    #1,d7
  878.     lea    (.test020plus,pc),a5
  879.  
  880. .test    call    Disable
  881.     call    Supervisor
  882.     call    Enable
  883.  
  884. .exit    move.l    d7,d0
  885.     movem.l    (sp)+,d1-a6
  886.     rts
  887.  
  888.  
  889. .use_mmulib    move.l    d0,a6    
  890.     call    GetMMUType
  891.     move.b    d0,d7
  892.     beq.b    .exit
  893.  
  894.     moveq    #-1,d7
  895.     cmp.b    #MUTYPE_68040,d0    040 MMU
  896.     beq.b    .exit
  897.     cmp.b    #MUTYPE_68060,d0    060 MMU
  898.     beq.b    .exit
  899.  
  900.     moveq    #1,d7            851/030 MMU
  901.     bra.b    .exit
  902.  
  903.  
  904. .test040plus    or.w    #$700,sr        Disable interrupts.
  905.     movec    vbr,a0            Get VBR
  906.     move.l    ($10,a0),-(sp)        Save Illegal Instruction vector
  907.     move.l    a0,-(sp)        Save VBR
  908.     lea    (.illegal040,pc),a1
  909.     move.l    a1,($10,a0)
  910.  
  911.     bsr    _fullflush040
  912.     movec    tc,d0            $4e7a0003    Test some "common" MMU regs:
  913.     movec    urp,d1            $4e7a1806    Test 040/060 MMU only reg!!
  914.     movec    srp,d1            $4e7a1807    Test 040/060 MMU only reg!!
  915.     nop
  916. .exit040
  917.     move.l    (sp)+,a0
  918.     move.l    (sp)+,($10,a0)        Restore Illegal Instruction vector
  919.     bsr    _fullflush040
  920.     nop
  921.     rte
  922.  
  923.  
  924.     CNOP    0,4
  925. .illegal040    moveq    #0,d7
  926.     lea    (.exit040,pc),a0
  927.     move.l    a0,(2,sp)
  928.     bsr    _fullflush040
  929.     nop
  930.     rte
  931.  
  932.  
  933. .test020plus    or.w    #$700,sr        Disable interrupts.
  934.  
  935.     ;···
  936.  
  937.     movec    vbr,a0            Get VBR
  938.     move.l    ($10,a0),-(sp)        Save Illegal Instruction vector
  939.     move.l    ($2C,a0),-(sp)        Save F-Line Emul vector
  940.     move.l    ($E0,a0),-(sp)        Save MMU Config Error vector
  941.     move.l    ($E4,a0),-(sp)        Save MMU Illegal Operation Error vector
  942.     move.l    ($E8,a0),-(sp)        Save MMU Access Level Violation Error vector
  943.     move.l    a0,-(sp)        Save VBR
  944.  
  945.     subq.l    #4,sp            Bug: This was at ··· before ("John Stunner" & Useless)
  946.  
  947.     lea    (.mmuinstfailure,pc),a1
  948.     move.l    a1,($10,a0)
  949.     move.l    a1,($2C,a0)
  950.     move.l    a1,($E0,a0)
  951.     move.l    a1,($E4,a0)
  952.     move.l    a1,($E8,a0)
  953.  
  954.     bsr    _flush020
  955.  
  956.     ; Try to get TC
  957.     dc.w    $F000,$2400        pflusha
  958.     dc.w    $F017,$4200        pmove.l tc,(sp)
  959.     dc.w    $F000,$2400        pflusha
  960. .exitsuper
  961.     addq.l    #4,sp
  962.     move.l    (sp)+,a0        Restore VBR
  963.     move.l    (sp)+,($E8,a0)        Restore MMU Access Level Violation Error vector
  964.     move.l    (sp)+,($E4,a0)        Restore MMU Illegal Operation vector
  965.     move.l    (sp)+,($E0,a0)        Restore MMU Config Error vector
  966.     move.l    (sp)+,($2C,a0)        Restore F-Line Emul vector
  967.     move.l    (sp)+,($10,a0)        Restore Illegal...
  968. .exitall    bsr.b    _flush020
  969.     nop
  970.     rte
  971.  
  972. .mmuinstfailure    moveq    #0,d7
  973.     lea    (.exitsuper,pc),a0    Invalid mmu instruction!
  974.     move.l    a0,(2,sp)
  975.     bsr.b    _flush020
  976.     nop
  977.     rte
  978.  
  979. _flush020    move.l    d0,-(sp)
  980.     movec    cacr,d0
  981.     or.w    #CACRF_ClearI!CACRF_ClearD,d0
  982.     movec    d0,cacr
  983.     move.l    (sp)+,d0
  984.     rts
  985.  
  986.  
  987. ; runnommu -- run routine with mmu disabled
  988. ;
  989. ;  IN: a0=code to run in supervisor, mmu off. *MUST* return with rts!!
  990. ; OUT: d0=whatever values routine leaves to d0. cc's set accordingly.
  991. ;NOTE: registers d0-d7/a0-a4 are passed to routine as is. Also routine
  992. ;      can return these registers.
  993. ;
  994. runnommu    movem.l    a5/a6,-(sp)
  995.     move.l    (_mmubase,pc),-(sp)
  996.     bne    .use_mmulib
  997.     move.l    (_ExecBase,pc),a6
  998.     move.b    (_mmuflag,pc),(sp)
  999.     lea    (.discodenommu,pc),a5
  1000.     addq.l    #4,sp
  1001.     beq.b    .doit
  1002.     lea    (.discode020,pc),a5
  1003.     bpl.b    .doit
  1004.     lea    (.discode040,pc),a5
  1005. .doit    call    Disable
  1006.     call    Supervisor
  1007.     call    Enable
  1008. .exit    movem.l    (sp)+,a5/a6
  1009.     tst.l    d0
  1010.     rts
  1011.  
  1012. .use_mmulib    move.l    (sp)+,a6
  1013.     move.l    a0,a5
  1014.     call    WithoutMMU
  1015.     bra.b    .exit
  1016.  
  1017.  
  1018. .discodenommu    or.w    #$700,sr
  1019.     jsr    (a0)
  1020.     nop
  1021.     rte
  1022.  
  1023.  
  1024. .discode020    or.w    #$700,sr
  1025.     subq.l    #4,sp
  1026.     dc.w    $F017,$4200        pmove.l tc,(sp)
  1027.     subq.l    #4,sp
  1028.     dc.w    $F017,$0E00        pmove.l tt1,(sp)
  1029.     subq.l    #4,sp
  1030.     dc.w    $F017,$0A00        pmove.l tt0,(sp)
  1031.     clr.l    -(sp)
  1032.     dc.w    $F000,$2400        pflusha
  1033.     tst.w    (1*4+2,sp)
  1034.     bpl.b    .dontdis1
  1035.     dc.w    $F017,$0800        pmove.l (sp),tt0
  1036. .dontdis1    tst.w    (2*4+2,sp)
  1037.     bpl.b    .dontdis2
  1038.     dc.w    $F017,$0C00        pmove.l (sp),tt1
  1039. .dontdis2    tst.l    (3*4,sp)
  1040.     bpl.b    .dontdis3
  1041.     dc.w    $F000,$2400        pflusha
  1042.     dc.w    $F017,$4000        pmove.l    (sp),tc
  1043. .dontdis3    dc.w    $F000,$2400        pflusha
  1044.     addq.l    #4,sp
  1045.     bsr    _flush020
  1046.     jsr    (a0)
  1047.     bsr    _flush020
  1048.     dc.w    $F000,$2400        pflusha
  1049.     tst.w    (2,sp)
  1050.     bpl.b    .dontrest1
  1051.     dc.w    $F017,$0800        pmove.l (sp),tt0
  1052. .dontrest1    addq.l    #4,sp
  1053.     tst.w    (2,sp)
  1054.     bpl.b    .dontrest2
  1055.     dc.w    $F017,$0C00        pmove.l (sp),tt1
  1056. .dontrest2    addq.l    #4,sp
  1057.     tst.l    (sp)            NOTE: can't use (sp)+ !
  1058.     bpl.b    .dontrest3
  1059.     dc.w    $F000,$2400        pflusha
  1060.     dc.w    $F017,$4000        pmove.l    (sp),tc
  1061. .dontrest3    addq.l    #4,sp
  1062.     dc.w    $F000,$2400        pflusha
  1063.     bsr    _flush020
  1064.     nop
  1065.     rte
  1066.  
  1067.  
  1068. .discode040    or.w    #$700,sr
  1069.     move.l    d0,-(sp)
  1070.     bsr.b    _fullflush040
  1071.     movec    tc,d0
  1072.     move.l    d0,-(sp)
  1073.     movec    dtt1,d0
  1074.     move.l    d0,-(sp)
  1075.     movec    dtt0,d0
  1076.     move.l    d0,-(sp)
  1077.     movec    itt1,d0
  1078.     move.l    d0,-(sp)
  1079.     movec    itt0,d0
  1080.     move.l    d0,-(sp)
  1081.     move.l    #$00FFC000,d0        LAmask=$ff E=%1 S=%10 (Ignore FC2 when matching), CM=%00 (Cacheable, Writethrough), W=%0 (R/W)
  1082.     movec    d0,itt0
  1083.     movec    d0,itt1
  1084.     movec    d0,dtt1
  1085.     move.l    #$0000C040,d0        LAmask=$00 E=%1 S=%10 (Ignore FC2 when matching) CM=%10 (Cache-Inhibited, Precise Exception Model)), W=%0 (R/W)
  1086.     movec    d0,dtt0
  1087.     move    #0,d0
  1088.     bsr.b    _fullflush040
  1089.     movec    d0,tc
  1090.     bsr.b    _fullflush040
  1091.     move.l    (5*4,sp),d0
  1092.     nop
  1093.     jsr    (a0)
  1094.     move.l    d0,(5*4,sp)
  1095.     bsr.b    _fullflush040
  1096.     move.l    (sp)+,d0
  1097.     movec    d0,itt0
  1098.     move.l    (sp)+,d0
  1099.     movec    d0,itt1
  1100.     move.l    (sp)+,d0
  1101.     movec    d0,dtt0
  1102.     move.l    (sp)+,d0
  1103.     movec    d0,dtt1
  1104.     move.l    (sp)+,d0
  1105.     bsr.b    _fullflush040
  1106.     movec    d0,tc
  1107.     bsr.b    _fullflush040
  1108.     move.l    (sp)+,d0
  1109.     nop
  1110.     rte
  1111.  
  1112. _fullflush040    FULLFLUSH040
  1113.     rts
  1114.  
  1115.  
  1116. TestBliz    movem.l    d1-a6,-(sp)
  1117.     moveq    #0,d7            "No Blizzard board with maprom"
  1118.     move.l    (_ExecBase,pc),a6
  1119.  
  1120.     bsr    .testblizppc
  1121.     bne    .exit_np
  1122.  
  1123.     lea    (.ExpName,pc),a1
  1124.     moveq    #33,d0
  1125.     bsr    OpenLib
  1126.     beq    .exit_np
  1127.     move.l    d0,a6
  1128.  
  1129.     lea    (.boards,pc),a2
  1130.     moveq    #0,d2
  1131.     moveq    #0,d6            clear maprom address lower...
  1132. .bfloop    moveq    #0,d0
  1133.     moveq    #0,d1
  1134.     move.w    (a2)+,d0        manufacturer
  1135.     bmi.b    .bfnomatch
  1136.     move.w    (a2)+,d1        product
  1137.     move.w    (a2)+,d6        maprom address, upper word
  1138.     move.l    (a2)+,d3        lower <<16 | upper ram area or -1
  1139.     sub.l    a0,a0
  1140.     call    FindConfigDev
  1141.     move.l    d0,d2
  1142.     beq.b    .bfloop
  1143. .bfnomatch    move.l    a6,a1
  1144.     move.l    (_ExecBase,pc),a6
  1145.     call    CloseLibrary
  1146.     tst.l    d2
  1147.     beq.b    .exit_np
  1148.     swap    d6            maprom address in d6
  1149.     move.l    d2,a0
  1150.     moveq    #0,d0
  1151.     move.b    (cd_Rom+er_Product,a0),d0
  1152.  
  1153.     lea    (_MK2,pc),a0
  1154.     cmp.w    #$19,d0
  1155.     seq    (a0)
  1156.     lea    (_B20x0,pc),a0
  1157.     cmp.w    #$18,d0
  1158.     seq    (a0)
  1159.     lea    (_CSPPC_MK3,pc),a0
  1160.     cmp.w    #$64,d0
  1161.     seq    (a0)
  1162.  
  1163.     move.l    d3,d0            lower & upper ram area for .csfindmemscan
  1164.     lea    (.blizfindmem,pc),a0
  1165.     addq.l    #1,d0
  1166.     beq.b    .skip            -1 it's blizzard!
  1167.     lea    (.csfindmem,pc),a0
  1168. .skip    call    Forbid
  1169.     lea    (MemList,a6),a5
  1170.     lea    (LH_TAIL,a5),a4
  1171.     jmp    (a0)
  1172.  
  1173. .exitsp
  1174.     move.l    d7,d0
  1175. .exit_known    call    Permit
  1176. .exit_np    tst.l    d0
  1177.     bne.b    .foundvalid
  1178.     lea    (_MemHeaderFlag,pc),a0
  1179.     clr.b    (a0)
  1180. .foundvalid    movem.l    (sp)+,d1-a6
  1181.     rts
  1182.  
  1183.  
  1184.  
  1185. .testblizppc    btst    #AFB_68040,(_AttnFlags+1,pc)
  1186.     beq    .pexit2
  1187.  
  1188.     lea    (.pidtag,pc),a1
  1189.     call    FindResident
  1190.     tst.l    d0
  1191.     bne.b    .foundit
  1192.  
  1193.     lea    (.nastyfind,pc),a0
  1194.     bsr    runnommu
  1195.     beq    .pexit2
  1196.  
  1197. .foundit    call    Forbid
  1198.  
  1199.     lea    (MemList,a6),a5
  1200.     lea    (LH_TAIL,a5),a4
  1201. .pscanloop    move.l    (a5),a5
  1202.     cmp.l    a5,a4
  1203.     beq    .pexit
  1204.     move.w    (MH_ATTRIBUTES,a5),d0
  1205.     and.w    #MEMF_POOLMEM!MEMF_PUBLIC!MEMF_CHIP!MEMF_FAST!MEMF_LOCAL!MEMF_24BITDMA,d0
  1206.     cmp.w    #MEMF_FAST!MEMF_PUBLIC,d0
  1207.     bne.b    .pscanloop
  1208. ;;    tst.l    (LN_NAME,a5)
  1209. ;;    bne.b    .pscanloop
  1210.     cmp.l    #$40000000,(MH_LOWER,a5)
  1211.     blo.b    .pscanloop
  1212.     move.l    (MH_UPPER,a5),d0
  1213.     cmp.l    #$80000000,d0
  1214.     bhs.b    .pscanloop
  1215.     and.l    #$0007FFFF,d0
  1216.     beq.b    .pfoundit
  1217.  
  1218. .pexit    call    Permit
  1219. .pexit2    moveq    #0,d0
  1220.     rts
  1221.  
  1222. .pfoundit    bsr.b    .foundmem
  1223.  
  1224.     call    Permit
  1225.  
  1226.     lea    (_BlizPPC,pc),a0
  1227.     st    (a0)
  1228.  
  1229.     move.l    #$FFF00000,d0
  1230.     rts
  1231.  
  1232.  
  1233. .nastyfind    lea    $F00020,a0        BlizzPPC flash is located here...
  1234.     move.l    #4000,d0        Must use .l!
  1235.     movem.l    (.pidtag,pc),d1-d4
  1236.  
  1237. .nf_find    cmp.l    (a0),d1
  1238.     bne.b    .nf_more
  1239.     cmp.l    (4,a0),d2
  1240.     bne.b    .nf_more
  1241.     cmp.l    (8,a0),d3
  1242.     bne.b    .nf_more
  1243.     cmp.l    (12,a0),d4
  1244.     bne.b    .nf_more
  1245.  
  1246.     moveq    #1,d0
  1247.     rts
  1248.  
  1249. .nf_more    addq.l    #1,a0
  1250.     subq.l    #1,d0
  1251.     bne.b    .nf_find
  1252.     rts
  1253.  
  1254. .pidtag    dc.b    'BlizzardPPC.IDTag',0
  1255.     CNOP    0,2
  1256.  
  1257.  
  1258. .foundmem    move.l    a5,a0            for Allocate_REVERSE
  1259.     lea    (_memhead,pc),a1
  1260.     moveq    #MH_FIRST,d0
  1261.     call    CopyMem
  1262.     lea    (_MemHeaderFlag,pc),a0
  1263.     st    (a0)
  1264.     rts
  1265.  
  1266.  
  1267. .blizfindmem
  1268. .trymore    sub.l    a3,a3
  1269. .scanloop    move.l    (a5),a5
  1270.     cmp.l    a5,a4
  1271.     beq    .exitsp
  1272.     move.w    (MH_ATTRIBUTES,a5),d0
  1273.     and.w    #MEMF_POOLMEM!MEMF_CHIP!MEMF_FAST!MEMF_PUBLIC,d0    Public fast?
  1274.     cmp.w    #MEMF_FAST!MEMF_PUBLIC,d0
  1275.     bne.b    .scanloop
  1276.     cmp.l    #$01000000,(MH_LOWER,a5)    32bit?
  1277.     blo.b    .scanloop
  1278. ;;    move.l    (LN_NAME,a5),d0
  1279. ;;    beq.b    .found
  1280. ;;    move.l    d0,a2
  1281. ;;    move.l    (a2),d0
  1282. ;;    or.l    #$20202020,d0        To lowercase
  1283. ;;    cmp.l    #'bliz',d0
  1284. ;;    beq.b    .found
  1285. ;;    tst.b    (a2)            null name -> buggy AllocMem result test!
  1286. ;;    bne.b    .scanloop
  1287. ;;.found
  1288.     bsr.b    .foundmem
  1289.  
  1290.     move.l    (MH_UPPER,a5),a3
  1291.  
  1292.     move.l    a3,d0            Test for MapROM:
  1293.     beq.b    .exit
  1294.     and.l    #$0007FFFF,d0
  1295.     bne.b    .exit
  1296.     move.l    a3,d0
  1297.     and.l    #$00080000,d0
  1298.     beq.b    .exit
  1299.  
  1300.     move.l    d6,d0            "known"?
  1301.     bne    .exit_known
  1302.  
  1303.     move.l    a3,a2
  1304.     add.l    #$80000-4,a2
  1305.     lea    $00F80000+$80000-4,a1
  1306.  
  1307.     lea    (.testcode,pc),a0
  1308.     bsr    runnommu
  1309.     beq.b    .exit
  1310.     move.l    a3,d7
  1311. .exit    tst.l    d7
  1312.     beq    .trymore
  1313.     bra    .exitsp
  1314.  
  1315.  
  1316. .is_mk2    move.l    #$08000000,d1
  1317.     move.l    #$10000000,d2
  1318. .mk2scanloop    move.l    (a5),a5
  1319.     cmp.l    a5,a4
  1320.     beq    .exitsp
  1321.     move.w    (MH_ATTRIBUTES,a5),d0
  1322.     and.w    #MEMF_POOLMEM!MEMF_CHIP!MEMF_FAST!MEMF_PUBLIC,d0    Public fast?
  1323.     cmp.w    #MEMF_FAST!MEMF_PUBLIC,d0
  1324.     bne.b    .mk2scanloop
  1325.     cmp.l    (MH_LOWER,a5),d1
  1326.     bhi.b    .mk2scanloop        bug: was blo!
  1327.     cmp.l    (MH_UPPER,a5),d2
  1328.     blo.b    .mk2scanloop
  1329.  
  1330.     bsr    .foundmem
  1331.  
  1332.     move.l    (MH_UPPER,a5),d0
  1333.     move.l    #$80000,d1
  1334.     move.l    d0,d2
  1335.     and.l    d1,d2
  1336.     bne.b    .mk2skip
  1337.     sub.l    d1,d0
  1338. .mk2skip    move.l    d0,d7
  1339.     bra    .exitsp
  1340.  
  1341.  
  1342.  
  1343. .csfindmem    move.b    (_MK2,pc),d0
  1344.     bne.b    .is_mk2
  1345.  
  1346. .cstrymore    sub.l    a3,a3
  1347. .csscanloop    move.l    (a5),a5
  1348.     cmp.l    a5,a4
  1349.     beq    .exitsp
  1350.     move.w    (MH_ATTRIBUTES,a5),d0
  1351.     and.w    #MEMF_POOLMEM!MEMF_CHIP!MEMF_FAST!MEMF_PUBLIC,d0    Public fast?
  1352.     cmp.w    #MEMF_FAST!MEMF_PUBLIC,d0
  1353.     bne.b    .csscanloop
  1354.     swap    d3            ; get lower limit
  1355.     cmp.w    (MH_LOWER,a5),d3
  1356.     bhi.b    .csscanloop
  1357.     swap    d3            ; get upper limit
  1358.     cmp.w    (MH_UPPER,a5),d3
  1359.     blo.b    .csscanloop
  1360.  
  1361.     bsr    .foundmem
  1362.  
  1363.     move.l    (MH_UPPER,a5),a3
  1364.  
  1365.     move.l    a3,d0            Test for MapROM:
  1366.     beq.b    .csexit
  1367.     and.l    #$0007FFFF,d0
  1368.     bne.b    .csexit
  1369.  
  1370.     move.l    d6,d0            "known"?
  1371.     bne    .exit_known
  1372.  
  1373.     move.b    (_B20x0,pc),d0
  1374.     beq.b    .no20x0a
  1375.  
  1376.     cmp.w    #$0800,(MH_LOWER,a5)    Test for $08000000 mem.
  1377.     bne.b    .csexit
  1378.     move.l    a3,a2
  1379.     lea    (.testcode20x0,pc),a0
  1380.     bsr    runnommu
  1381.     beq.b    .csexit
  1382. .no20x0a
  1383.     move.l    a3,d7
  1384.  
  1385. .csexit    tst.l    d7
  1386.     beq    .cstrymore
  1387.     bra    .exitsp
  1388.  
  1389.  
  1390. ; a1=ROM, a2=RAM
  1391. .testcode    or.w    #$700,sr        Disable interrupts
  1392.  
  1393.     move.l    (a2),d1
  1394.     cmp.l    (a1),d1
  1395.     bne.b    .exite
  1396.     not.l    d1
  1397.     move.l    d1,(a2)
  1398.     bsr.b    .cacheclr
  1399.     cmp.l    (a1),d1
  1400.     sne    d0
  1401.     not.l    d1            Restore before testing!
  1402.     move.l    d1,(a2)            (this was bugged)
  1403.     bsr.b    .cacheclr
  1404.     tst.b    d0
  1405.     bne.b    .exite
  1406.     cmp.l    (a1),d1
  1407.     bne.b    .exite
  1408.     moveq    #1,d0
  1409.     rts
  1410. .exite    moveq    #0,d0
  1411.     rts
  1412.  
  1413. .cacheclr    btst    #AFB_68020,(_AttnFlags+1,pc)
  1414.     bne    CacheClrS
  1415.     rts
  1416.  
  1417.  
  1418. ; a2=RAM
  1419. .testcode20x0    or.w    #$700,sr        Disable interrupts
  1420.  
  1421.     moveq    #0,d4
  1422.  
  1423.     movec    dfc,d0
  1424.     move.l    d0,-(sp)
  1425.     moveq    #3,d0            Entry FC for Control Registers (also num of areas-1)
  1426.     movec    d0,dfc
  1427.     bsr.b    .cacheclr
  1428. .tcloop    moveq    #0,d1
  1429.     bsr    SetMemShadow
  1430.  
  1431.     bsr.b    .cacheclr
  1432.     nop
  1433.     move.l    (a2),d2
  1434.     move.l    d2,-(sp)
  1435.     eor.l    #$BADC0DE5,d2
  1436.     move.l    d2,(a2)
  1437.     nop
  1438.     bsr.b    .cacheclr
  1439.     move.l    (a2),d3
  1440.     move.l    (sp)+,(a2)
  1441.     nop
  1442.     bsr.b    .cacheclr
  1443.     cmp.l    d2,d3
  1444.     beq.b    .tcfound
  1445.     moveq    #1,d1
  1446.     bsr    SetMemShadow
  1447.     subq.l    #1,d0
  1448.     bpl.b    .tcloop
  1449.  
  1450. .tcexit    move.l    (sp)+,d0
  1451.     movec    d0,dfc
  1452.     bsr.b    .cacheclr
  1453.     move.l    d4,d0
  1454.     rts
  1455.  
  1456. .tcfound    lea    (_B20x0Bank,pc),a0    Self Modifying Code! MUST
  1457.     move.b    d0,(a0)            clear caches (.cacheclr does it)
  1458.     moveq    #1,d1
  1459.     bsr.b    SetMemShadow        Uses d0!
  1460.     moveq    #1,d4
  1461.     bra.b    .tcexit
  1462.  
  1463.  
  1464.  
  1465. BITEM    MACRO
  1466.     dc.w    \2,\3,\1
  1467.     dc.l    \4
  1468.     ENDM
  1469.  
  1470. .boards    BITEM $0000,BLIZPROD,$18,$08001000    18 2040-ERC/2060
  1471.     ;BITEM $0000,BLIZPROD,$0C,$08002000    0C Cyberstorm MKI
  1472.     BITEM $0000,BLIZPROD,$19,0        19 Cyberstorm MKII
  1473.     BITEM $FFF0,BLIZPROD,$64,$08002000    64 Cyberstorm MKIII / PPC
  1474.     BITEM $4FF8,BLIZPROD,$11,-1        11 1230-IV / 1260 / 1240-T/ERC
  1475.     BITEM $1EF8,BLIZPROD,$0D,-1        0D 1230-III
  1476.     BITEM $0FF8,BLIZPROD,$0B,-1        0B 1230-II
  1477. ;;    BITEM $????,BLIZPROD,$??,-1        0? 1230-I
  1478.     dc.w    -1
  1479.  
  1480.  
  1481. .ExpName    dc.b    'expansion.library',0
  1482.     CNOP    0,2
  1483.  
  1484.  
  1485. ;
  1486. ; This one is from old CyberMap I think...
  1487. ; Modified a bit.
  1488. ;
  1489. ;*********************************************************
  1490. ;*       writes memshadowregister of the given rambank
  1491. ;*       setmemshadow(D0=bank,D1=on/off (bool))
  1492. ;*********************************************************
  1493. ;*       $ 8    2    c
  1494. ;*       %100x yy10 1100 ---- ---- ---- ---- ----Shadow Register Format
  1495. ;*                    x = Set/Clr Flag  0=on 1=off
  1496. ;*                    y = Bank Number
  1497. MEMSHWREG    EQU    $82C00000        Shadow Enable Control Register
  1498. SetMemShadowN    moveq    #0,d0            Self Modifying Code!! Must clear
  1499. _B20x0Bank    EQU    *-1            caches before calling SetMemShadowN!
  1500. ; IN: d0=bank, d1=mode
  1501. SetMemShadow    movem.l    d0-d1/a0,-(sp)
  1502.     and.l    #3,d0            mask bank number
  1503.     ror.l    #6,d0            shift in place
  1504.     or.l    #MEMSHWREG,d0        mask in MEMSHWREG adr
  1505.     tst.l    d1
  1506.     bne.b    .sf_skip        =! 0 -> TRUE -> b28=0
  1507.     bset    #28,d0            == 0 -> FALSE -> b28=1
  1508. .sf_skip    move.l    d0,a0            Write Register
  1509.     moves.l    a0,(a0)
  1510.     movem.l    (sp)+,d0-d1/a0
  1511. ;;    rts
  1512.     bra    _fullflush040
  1513.  
  1514.  
  1515.  
  1516. ; FindMemHeader - find memheader even if it has moved by PoolMem
  1517. ; MUST call this in Forbid()! Use returned memheader before Permit()!
  1518. ;
  1519. ;  IN: a0=clone of MH (up to MH_FIRST) to find
  1520. ;      a6=execbase
  1521. ; OUT: a0=memheader or NULL, Z flag set
  1522. ;
  1523. FindMemHeader    movem.l    d0-d3/a1,-(sp)
  1524.     moveq    #0,d0
  1525.  
  1526.     move.w    (MH_ATTRIBUTES,a0),d1
  1527.     move.w    (LN_TYPE,a0),d2
  1528.     move.l    (LN_NAME,a0),d3
  1529.  
  1530.     lea    (MemList,a6),a0
  1531.     lea    (LH_TAIL,a0),a1
  1532. .find    move.l    (a0),a0
  1533.     cmp.l    a0,a1
  1534.     beq.b    .fail
  1535.     cmp.w    (MH_ATTRIBUTES,a0),d1
  1536.     bne.b    .find
  1537.     cmp.w    (LN_TYPE,a0),d2        type & pri
  1538.     bne.b    .find
  1539.     cmp.l    (LN_NAME,a0),d3
  1540.     bne.b    .find
  1541.  
  1542. .exit    move.l    a0,d0
  1543.     movem.l    (sp)+,d0-d3/a1
  1544.     rts
  1545.  
  1546. .fail    sub.l    a0,a0
  1547.     bra.b    .exit
  1548.  
  1549.  
  1550.  
  1551. ;  IN: a0=rom, d0=rom len
  1552. ; OUT: d0=success, fail if no AGA or WaitBlit func couln't be found
  1553. PutHogWaitBlit    movem.l    d1-a6,-(sp)
  1554.     moveq    #0,d7
  1555.  
  1556.     cmp.w    #39,($C,a0)        Requires rom 39+
  1557.     blo.b    .exit
  1558.  
  1559.     lea    -4(a0,d0.l),a1
  1560.  
  1561.     move.w    $DFF004,d0        Test AGA:
  1562.     and.w    #$7F00,d0
  1563.     lsr.w    #8,d0
  1564.     bclr    #4,d0
  1565.     cmp.b    #$22,d0
  1566.     beq.b    .aga
  1567.     cmp.b    #$23,d0
  1568.     bne.b    .exit
  1569. .aga
  1570.     move.l    #$08390006,d0
  1571. .find    addq.l    #2,a0
  1572.     cmp.l    a1,a0
  1573.     beq.b    .exit
  1574.     cmp.l    (a0),d0
  1575.     bne.b    .find
  1576.     cmp.l    #$00DFF002,(4,a0)
  1577.     bne.b    .find
  1578.     cmp.l    #$66024E75,(8,a0)
  1579.     bne.b    .find
  1580.  
  1581.     cmp.l    #$08390006,(-8,a0)    No KS 1.x!
  1582.     beq.b    .exit
  1583.     cmp.l    #$4A3900DF,(-6,a0)    KS 2.x/3.x:
  1584.     bne.b    .exit
  1585.     subq.l    #6,a0
  1586.     lea    (.waitblit,pc),a1
  1587.     moveq    #(.waitblitend-.waitblit)/2,d0
  1588. .copy    move.w    (a1)+,(a0)+
  1589.     subq.l    #1,d0
  1590.     bne.b    .copy
  1591.     moveq    #1,d7
  1592.  
  1593. .exit    move.l    d7,d0
  1594.     movem.l    (sp)+,d1-a6
  1595.     rts
  1596.  
  1597.     ; 1.x  36 bytes
  1598.     ; 2.05 40 bytes
  1599.     ; 3.0  48 bytes
  1600.     ; 3.1  48 bytes
  1601. .waitblit    btst    #DMAB_BLTDONE-8,$DFF000+dmaconr            8
  1602.     bne.b    .gowait                        2
  1603.     rts                            2
  1604. .gowait    move.l    a0,-(sp)                    2
  1605.     lea    ($DFF000+dmaconr),a0                6
  1606.     move.w    #DMAF_SETCLR!DMAF_BLITHOG,(dmacon-dmaconr,a0)    6
  1607. .wait    btst    #DMAB_BLTDONE-8,(a0)                4
  1608.     bne.b    .wait                        2
  1609.     move.w    #DMAF_BLITHOG,(dmacon-dmaconr,a0)        6
  1610.     move.l    (sp)+,a0                    2
  1611.     rts                            2 =42
  1612.     IFGT    0
  1613. .gowait    move.w    #DMAF_SETCLR!DMAF_BLITHOG,$DFF000+dmacon    8
  1614. .wait    btst    #DMAB_BLTDONE-8,$DFF000+dmaconr    8
  1615.     bne.b    .wait                2
  1616.     move.w    #DMAF_BLITHOG,$DFF000+dmacon    8
  1617.     rts                    2 =40
  1618.     ENDC
  1619. .waitblitend
  1620.     IFGT    (.waitblitend-.waitblit)-42
  1621.     FAIL    !! WAITBLIT routine too long !!
  1622.     ENDC
  1623.  
  1624.  
  1625.  
  1626. ;  IN: a0=rom start (buf)
  1627. ;      d0=rom len
  1628. ;      a1=name
  1629. ; OUT: d0=ptr to resident (buf) or NULL
  1630. FindResident    movem.l    d1-a6,-(sp)
  1631.     move.l    a1,a3
  1632.  
  1633.     move.l    d0,d4
  1634.     move.l    a0,a4
  1635.  
  1636.     moveq    #1,d6
  1637.     lea    (_erh_arealen,pc),a0
  1638.     move.l    (a0)+,d0
  1639.     beq.b    .try_rom
  1640.  
  1641.     move.l    (a0),a0
  1642.     sub.l    a5,a5            Difference=0
  1643.  
  1644. .findres    moveq    #RT_SIZE-2,d1
  1645.     sub.l    d1,d0
  1646.     move.w    #RTC_MATCHWORD,d1
  1647. .find    subq.l    #2,d0
  1648.     bls.b    .try_rom
  1649.     cmp.w    (a0)+,d1
  1650.     bne.b    .find
  1651.     moveq    #2,d2
  1652.     add.l    (a0),d2            (RT_MATCHTAG-2,a0),d2
  1653.     add.l    a5,d2
  1654.     cmp.l    a0,d2
  1655.     bne.b    .find
  1656.     move.l    (RT_NAME-2,a0),a1
  1657.     add.l    a5,a1
  1658.     move.l    a3,a2
  1659. .compare    cmpm.b    (a2)+,(a1)+
  1660.     bne.b    .find
  1661.     tst.b    (-1,a2)
  1662.     bne.b    .compare
  1663.  
  1664.     move.l    a0,d0
  1665.     subq.l    #2,d0
  1666.  
  1667. .exit    movem.l    (sp)+,d1-a6
  1668.     rts
  1669.  
  1670. .exit_nf    moveq    #0,d0
  1671.     bra.b    .exit
  1672.  
  1673. .try_rom    tst.l    d6
  1674.     beq.b    .exit_nf
  1675.  
  1676.     move.l    d4,d0
  1677.     move.l    a4,a0
  1678.  
  1679.     move.l    #$01000000,d1
  1680.     sub.l    d0,d1            d2=rom start (rom)
  1681.     move.l    a0,a5
  1682.     sub.l    d1,a5            a5=difference
  1683.  
  1684.     moveq    #0,d6
  1685.     bra.b    .findres
  1686.  
  1687.  
  1688. PATHBUF_SIZE    EQU    256
  1689.  
  1690. ;  IN: a0=ptr to rom (buf), d0=rom len, a3=array  (d6=dosbase)
  1691. ; OUT: d0=success, will print doserror if failed
  1692. DoPlanting    movem.l    d1-a6,-(sp)
  1693.     lea    (-PATHBUF_SIZE,sp),sp
  1694.     move.l    sp,a5
  1695.     move.l    d6,a6
  1696.  
  1697.     move.l    d0,d1
  1698.     move.l    (ARG_MODULE,a3),d0
  1699.     beq    .exit            OK! ;-)
  1700.     move.l    d0,a2
  1701.  
  1702.     IFND    HAVE_NEW_ENV_METHOD
  1703.     moveq    #0,d3
  1704.     ENDC
  1705.     moveq    #0,d4            null!
  1706.     cmp.w    #37,(LIB_VERSION,a6)
  1707.     blo    .not20
  1708.  
  1709.     IFD    HAVE_NEW_ENV_METHOD
  1710.  
  1711.     movem.l    d1-d3/a0,-(sp)
  1712.     sub.l    a1,a1
  1713.     move.l    (_ExecBase,pc),a6
  1714.     call    FindTask
  1715.     move.l    d6,a6
  1716.     move.l    d0,a0
  1717.     lea    (pr_WindowPtr,a0),a0
  1718.     move.l    (a0),-(sp)
  1719.     move.l    a0,-(sp)
  1720.     moveq    #-1,d0
  1721.     move.l    d0,(a0)
  1722.  
  1723.     lea    (_VarName,pc),a0
  1724.     move.l    a0,d1
  1725.     move.l    a5,d2
  1726.     move.l    #PATHBUF_SIZE,d3    d4=0
  1727.     call    GetVar
  1728.     addq.l    #1,d0
  1729.     bne.b    .gotvar
  1730.     lea    (_VarEnvArcName,pc),a0
  1731.     move.l    a0,d1
  1732.     call    GetVar
  1733.     addq.l    #1,d0
  1734.     bne.b    .gotvar
  1735.  
  1736.     lea    (_VarEnvArcName,pc),a0
  1737.     move.l    a0,d1
  1738.     move.l    #MODE_OLDFILE,d2
  1739.     call    Open
  1740.     move.l    d0,d4            d4=0 if failed, no dirlock
  1741.     beq.b    .novar
  1742.     move.l    d4,d1
  1743.     move.l    a5,d2
  1744.     subq.l    #1,d3            #PATHBUF_SIZE-1
  1745.     call    Read
  1746.     move.l    d0,d2
  1747.     move.l    d4,d1
  1748.     call    Close
  1749.     tst.l    d2
  1750.     bmi.b    .novar
  1751.     clr.b    0(a5,d2.l)        null terminate
  1752.     move.l    a5,a0            strip linefeeds
  1753. .filt_loop    move.b    (a0)+,d0
  1754.     beq.b    .filt_end
  1755.     cmp.b    #10,d0
  1756.     bne.b    .filt_loop
  1757.     clr.b    -(a0)
  1758. .filt_end
  1759. .gotvar
  1760.     move.l    a5,d1
  1761.     bsr    _lockread
  1762.     beq.b    .nolock
  1763.     move.l    d1,d4
  1764.     call    CurrentDir
  1765.     move.l    d0,d7            oldlock
  1766. .nolock
  1767. .novar
  1768.     move.l    (sp)+,a0
  1769.     move.l    (sp)+,(a0)
  1770.  
  1771.     movem.l    (sp)+,d1-d3/a0
  1772. .not20
  1773.  
  1774.     ELSE
  1775.  
  1776.     movem.l    d1-d2/a0,-(sp)
  1777.     sub.l    a1,a1
  1778.     move.l    (_ExecBase,pc),a6
  1779.     call    FindTask
  1780.     move.l    d6,a6
  1781.     move.l    d0,a0
  1782.     lea    (pr_WindowPtr,a0),a0
  1783.     move.l    (a0),-(sp)
  1784.     move.l    a0,-(sp)
  1785.     moveq    #-1,d0
  1786.     move.l    d0,(a0)
  1787.  
  1788.     lea    (_EnvName,pc),a0
  1789.     move.b    #':',(3,a0)
  1790.     move.l    a0,d1
  1791.     bsr    _lockread
  1792.     move.l    d0,d2
  1793.     call    UnLock
  1794.     move.l    (sp)+,a0
  1795.     move.l    (sp)+,(a0)
  1796.     tst.l    d2
  1797.     bne.b    .has_env
  1798.  
  1799.     lea    (_EnvArcName,pc),a0
  1800.     move.l    a0,d1
  1801.     bsr    _lockread
  1802.     beq.b    .no_envarclock
  1803.     move.l    d0,d2
  1804.     lea    (_EnvName,pc),a0
  1805.     clr.b    (3,a0)
  1806.     move.l    a0,d1
  1807.     call    AssignLock
  1808.     move.l    d0,d3            d3=assignstate
  1809.     bne.b    .got_assign
  1810.     move.l    d2,d1
  1811.     call    UnLock
  1812. .got_assign
  1813. .no_envarclock
  1814. .has_env
  1815.     lea    (_VarName,pc),a0
  1816.     move.l    a0,d1
  1817.     move.l    a5,d2
  1818.     move.l    d3,-(sp)
  1819.     move.l    #PATHBUF_SIZE,d3    d4=0
  1820.     call    GetVar
  1821.     move.l    (sp)+,d3
  1822.     addq.l    #1,d0
  1823.     beq.b    .novar
  1824.     move.l    a5,d1
  1825.     bsr    _lockread
  1826.     beq.b    .nolock
  1827.     move.l    d0,d4
  1828.     move.l    d4,d1
  1829.     call    CurrentDir
  1830.     move.l    d0,d7            oldlock
  1831. .nolock
  1832. .novar    movem.l    (sp)+,d1-d2/a0
  1833. .not20
  1834.     ENDC
  1835.  
  1836. .loop    move.l    (a2)+,d0
  1837.     beq.b    .exit2
  1838.     move.l    d0,a1
  1839.     move.l    d1,d0
  1840.     bsr.b    FilePlant
  1841.     bne.b    .loop
  1842.     bsr    _PrintFault        IN: d5=kickflag, d6=dosbase
  1843.     lea    (PlantError,pc),a0
  1844.     move.l    a2,a1
  1845.     subq.l    #4,a1
  1846.     bsr    _Printf
  1847.     moveq    #-1,d0
  1848.  
  1849. .exit2    tst.l    d4
  1850.     beq.b    .nodirlock
  1851.     move.l    d0,-(sp)
  1852.     move.l    d7,d1
  1853.     call    CurrentDir
  1854.     move.l    d4,d1
  1855.     call    UnLock
  1856.     move.l    (sp)+,d0
  1857. .nodirlock
  1858.     IFND    HAVE_NEW_ENV_METHOD
  1859.  
  1860.     tst.l    d3
  1861.     beq.b    .noassign
  1862.     move.l    d0,d7
  1863.     lea    (_EnvName,pc),a0
  1864.     clr.b    (3,a0)
  1865.     move.l    a0,d1
  1866.     moveq    #0,d2
  1867.     call    AssignLock
  1868.     move.l    d7,d0
  1869. .noassign
  1870.     ENDC
  1871.  
  1872. .exit    not.l    d0
  1873.     lea    (PATHBUF_SIZE,sp),sp
  1874.     movem.l    (sp)+,d1-a6
  1875.     rts
  1876.  
  1877. _lockread    moveq    #ACCESS_READ,d2
  1878.     call    Lock
  1879.     move.l    d0,d1
  1880.     rts
  1881.  
  1882. ;  IN: a1=ptr to filename, a0=ptr to rom (buf), d0=rom len  (d6=dosbase)
  1883. ; OUT: d0=success
  1884. FilePlant    movem.l    d1-a6,-(sp)
  1885.     move.l    d6,a6
  1886.     moveq    #0,d7
  1887.  
  1888.     move.l    d0,d4
  1889.     move.l    a0,a4
  1890.  
  1891.     ; this is a elfloadseg-patch ioerr bug
  1892.     ; workaround:
  1893.  
  1894.     move.l    a1,a2
  1895.     move.l    a1,d1
  1896.     moveq    #ACCESS_READ,d2
  1897.     call    Lock
  1898.     move.l    d0,d1
  1899.     beq.b    .exit
  1900.     call    UnLock
  1901.  
  1902.     move.l    a2,d1
  1903.     call    LoadSeg
  1904.     move.l    d0,d5
  1905.     beq.b    .exit
  1906.  
  1907.     move.l    d5,a1
  1908.     add.l    a1,a1
  1909.     addq.l    #2,a1            ;-)
  1910.     add.l    a1,a1
  1911.     move.l    d4,d0
  1912.     move.l    a4,a0
  1913.     bsr    InstallModule
  1914.     move.l    d0,d7
  1915.     bne.b    .was_module
  1916.  
  1917.     ; try direct executable planting
  1918.  
  1919.     cmp.l    #BKMODULE_ID,(a1)    was it a module that failed?
  1920.     beq.b    .was_module        yes, quit!
  1921.  
  1922.     ; the test above is really needed or else horrors
  1923.     ; would happen. namely installing non-functional
  1924.     ; resident tag that would crash system.
  1925.  
  1926.     move.l    (8*4,sp),d1        filename from stack
  1927.     move.l    #MODE_OLDFILE,d2
  1928.     call    Open
  1929.     move.l    d0,d4
  1930.     beq.b    .exit
  1931.  
  1932.     lea    (.af_dosbase,pc),a0
  1933.     move.l    a6,(a0)
  1934.  
  1935.     pea    (.freefunc,pc)
  1936.     pea    (.allocfunc,pc)
  1937.     pea    (.readfunc,pc)
  1938.     move.l    sp,a1
  1939.     clr.l    -(sp)
  1940.     move.l    sp,a2
  1941.     sub.l    a0,a0
  1942.     ;move.l    d4,d0            d0=filehandle!!
  1943.     call    InternalLoadSeg
  1944.     lea    (4*4,sp),sp
  1945.     move.l    d0,d7
  1946.  
  1947.     move.l    d4,d1
  1948.     call    Close
  1949.     
  1950. .was_module    move.l    d5,d1
  1951.     beq.b    .exit
  1952.     call    UnLoadSeg
  1953. .exit    move.l    d7,d0
  1954.     movem.l    (sp)+,d1-a6
  1955.     rts
  1956.  
  1957.  
  1958.  
  1959. ;  IN: d0=size, d1=flags
  1960. ; OUT: d0=memory
  1961. .allocfunc    tst.l    d0
  1962.     bne.b    .af_do
  1963.  
  1964. .af_fail    move.l    a6,-(sp)
  1965.     move.l    (.af_dosbase,pc),a6
  1966.     moveq    #ERROR_NO_FREE_STORE,d1
  1967.     call    SetIoErr
  1968.     move.l    (sp)+,a6
  1969.     moveq    #0,d0
  1970.     rts
  1971.  
  1972. .af_do    btst    #MEMB_CHIP,d1        don't allow chipmem
  1973.     bne.b    .af_fail
  1974.  
  1975.     movem.l    d0/d1,-(sp)
  1976.     move.l    (_erh_memheader,pc),d0
  1977.     beq.b    .af_exit
  1978.     move.l    d0,a0
  1979.     move.l    (sp),d0
  1980.     call    Allocate
  1981.     tst.l    d0
  1982.     beq.b    .af_nomem
  1983.     ; d0=return val
  1984.  
  1985.     ; should clear allocated area?
  1986.     btst    #MEMB_CLEAR-16,(1,sp)
  1987.     beq.b    .af_exit
  1988.  
  1989.     ; get original alloc req and align it
  1990.     move.l    (sp),d1
  1991.     addq.l    #MEM_BLOCKMASK,d1
  1992.     and.w    #-MEM_BLOCKSIZE,d1
  1993.  
  1994.     move.l    d0,a0
  1995. .af_clear    clr.l    (a0)+
  1996.     clr.l    (a0)+
  1997.     subq.l    #8,d1
  1998.     bne.b    .af_clear
  1999.  
  2000. .af_exit    addq.l    #8,sp
  2001.     rts
  2002.  
  2003. .af_nomem    addq.l    #8,sp
  2004.     bra.b    .af_fail
  2005.  
  2006. .af_dosbase    ds.l    1
  2007.  
  2008.  
  2009. ;  IN: a1=memory d0=size
  2010. ; OUT: -
  2011. .freefunc    tst.l    d0
  2012.     bne.b    .ff_do
  2013. .ff_no    rts
  2014. .ff_do    move.l    a1,d1
  2015.     beq.b    .ff_no
  2016.  
  2017.     move.l    (_erh_memheader,pc),d1
  2018.     beq.b    .ff_no
  2019.  
  2020.     movem.l    d0/a1,-(sp)
  2021.     move.l    a1,d1
  2022.     and.w    #-MEM_BLOCKSIZE,d1
  2023.     exg    d1,a1
  2024.     addq.l    #MEM_BLOCKMASK,d0
  2025.     sub.l    a1,d1
  2026.     add.l    d1,d0
  2027.     moveq    #-1,d1
  2028.     and.l    #-MEM_BLOCKSIZE,d0    note: .l!!
  2029.     beq.b    .ff_nofill
  2030. .ff_fill    move.l    d1,(a1)+
  2031.     move.l    d1,(a1)+
  2032.     subq.l    #8,d0
  2033.     bne.b    .ff_fill
  2034. .ff_nofill    movem.l    (sp)+,d0/a1
  2035.  
  2036.     move.l    (_erh_memheader,pc),a0
  2037.     jmp    (_LVODeallocate,a6)
  2038.  
  2039. ;  IN: d1=fh, d2=buffer, d3=len
  2040. ; OUT: d0=actual
  2041. .readfunc    jmp    (_LVORead,a6)
  2042.  
  2043.  
  2044.  
  2045. ;  IN: d1.l=error (d6=dosbase)
  2046. SetIoErr    movem.l    d0-d1/a0-a1/a6,-(sp)
  2047.     move.l    d6,a6
  2048.     cmp.w    #36,(LIB_VERSION,a6)
  2049.     blo.b    .old
  2050.     call    SetIoErr
  2051.     bra.b    .exit
  2052. .old    move.l    (_ExecBase,pc),a6
  2053.     sub.l    a1,a1
  2054.     call    FindTask
  2055.     move.l    d0,a0
  2056.     move.l    (4,sp),(pr_Result2,a0)
  2057. .exit    movem.l    (sp)+,d0-d1/a0-a1/a6
  2058.     rts
  2059.  
  2060.  
  2061. ;  IN: a1=ptr to module, a0=ptr to rom (buf), d0=rom len  (d6=dosbase)
  2062. ; OUT: d0=success, d1/a0/a1 preserved
  2063. InstallModule    movem.l    d1-a6,-(sp)
  2064.     moveq    #0,d7
  2065.     move.l    #ERROR_OBJECT_WRONG_TYPE,d1
  2066.     bsr.b    SetIoErr
  2067.  
  2068.     move.l    #$01000000,d2
  2069.     sub.l    d0,d2
  2070.     move.l    a0,a5
  2071.     sub.l    d2,a5            a5=difference
  2072.  
  2073.     cmp.l    #BKMODULE_ID,(a1)+    (bkm_ID)
  2074.     bne.b    .exit
  2075.     move.w    (a1)+,d4        d4=bkm_Flags, a1=bkm_ResTag
  2076.     move.w    d4,d1
  2077.     and.w    #~BKMF_ALL,d1        Test validity:
  2078.     bne.b    .exit
  2079.     cmp.w    #BKEP_ID,(a1)        Test for patch module:
  2080.     beq    .is_epatch
  2081.     cmp.l    #RTC_MATCHWORD<<16,(a1)
  2082.     bne.b    .exit
  2083.  
  2084.     move.l    #ERROR_OBJECT_TOO_LARGE,d1
  2085.     bsr.b    SetIoErr
  2086.  
  2087.     lea    (.replace_test,pc),a3
  2088.     lsr.w    #1,d4            btst    #BKMB_ReplaceMode,d4
  2089.     bcs.b    .replace
  2090.     lea    (.single_test,pc),a3
  2091.     lsr.w    #1,d4            btst    #BKMB_SingleMode,d4
  2092.     bcc.b    .no_findresident
  2093. .replace    movem.l    d0/a1,-(sp)
  2094.     add.l    (RT_NAME,a1),a1
  2095.     bsr    FindResident
  2096.     move.l    d0,a2
  2097.     movem.l    (sp)+,d0/a1
  2098.     jmp    (a3)
  2099. .no_findresident
  2100. .is_single
  2101. .is_erbf    move.l    (RT_ENDSKIP,a1),d1
  2102.     lsr.w    #1,d4            btst    #BKMB_ExtResBuf,d4
  2103.     bcc.b    .no_extresbuf1
  2104.     neg.l    d1
  2105. .no_extresbuf1    bsr    FindSpace
  2106.     beq.b    .exit
  2107.  
  2108. .go_replace    move.l    d0,a3            a3=ptr to func (buf)
  2109.     move.l    d1,a2            a2=ptr to func (ROM)
  2110.  
  2111.     move.w    ($C,a0),d1        d1=rom version
  2112.     move.l    a1,a0
  2113.     lea    (RT_VERSION,a0),a4
  2114.     cmp.b    (a4),d1            Test version!
  2115.     blo.b    .nofail
  2116.     move.b    d1,(a4)            Force current version!
  2117.     cmp.w    #36,d1
  2118.     shs    d1
  2119.     move.l    a3,a1            a2=ptr to func (ROM)
  2120.     bsr    PutResident
  2121.  
  2122. .nofail    moveq    #1,d7
  2123. .exit    move.l    d7,d0
  2124. .exit2    bsr    CacheClearOS        Clear caches.
  2125.     movem.l    (sp)+,d1-a6
  2126.     rts
  2127.  
  2128.  
  2129. .replace_test    beq.b    .exit            If no match exit!
  2130.     move.b    (RT_PRI,a2),d1
  2131.     cmp.b    (RT_PRI,a1),d1
  2132.     bne.b    .exit            If no match exit!
  2133.  
  2134.     lsr.w    #1,d4
  2135.     btst    #0,d4            btst BKMB_ExtResBuf,d4
  2136.     bne.b    .is_erbf
  2137.  
  2138.     move.l    (RT_ENDSKIP,a2),d1    d1=ptr to ENDSKIP (ROM)
  2139.     add.l    a5,d1            d1=ptr to ENDSKIP (buf)
  2140.     sub.l    a2,d1
  2141.     cmp.l    (RT_ENDSKIP,a1),d1
  2142.     ble.b    .exit
  2143.     move.l    a2,d0
  2144.     move.l    d0,d1
  2145.     sub.l    a5,d1
  2146.     bra.b    .go_replace
  2147.  
  2148.  
  2149. .single_test    beq.b    .is_single        SINGLE: If no match continue!
  2150.     move.b    (RT_PRI,a2),d1
  2151.     cmp.b    (RT_PRI,a1),d1
  2152.     bne.b    .is_single        SINGLE: If no match continue!
  2153.     move.l    #ERROR_TOO_MANY_ARGS,d1
  2154.     bsr    SetIoErr
  2155.     bra.b    .exit
  2156.  
  2157. ; a0=ptr to rom start (buf), a1=ptr to epatch, d0=rom len, d2=ptr to rom start (ROM)
  2158. .is_epatch    lea    (2,a1),a5
  2159.     move.l    d2,a1
  2160.     lea    (FindResident,pc),a2
  2161.     lea    (InstallModule,pc),a3
  2162.     lea    (_Printf,pc),a4
  2163.     move.l    (_ExecBase,pc),a6
  2164.     jsr    (a5)
  2165.     bra.b    .exit2
  2166.  
  2167.  
  2168. ;  IN: a0=rom (buf), d0=rom len, d1=required space (negate if ExtResBuf required)
  2169. ; OUT: d0=ptr to area (buf) or NULL, d1=ptr to area (rom)
  2170. ;NOTE: condition codes set on return!
  2171. FindSpace    movem.l    d2-d3/d6-d7/a0-a2,-(sp)
  2172.     moveq    #0,d7
  2173.  
  2174.     move.l    #$01000000,d2
  2175.     sub.l    d0,d2
  2176.     move.l    a0,d6
  2177.     sub.l    d2,d6            d6=difference (buf-rom)
  2178.  
  2179.     tst.l    d1
  2180.     bmi.b    .required_extres
  2181.  
  2182.     lea    ROMSUMOFFS(a0,d0.l),a1
  2183.     bsr.b    .find
  2184.     bhs.b    .found            Big enough 'empty' space.
  2185.  
  2186.     move.l    #$00040000,d2
  2187.     cmp.l    d2,d0            Test for >$40000 ROM
  2188.     bls.b    .try_extres
  2189.  
  2190.     lea    (a0,d0.l),a1
  2191.     sub.l    d2,a1            a1=$FC0000
  2192.     move.l    (a1),d2
  2193.     and.l    #$FFF8FFFF,d2
  2194.     cmp.l    #$11104EF9,d2
  2195.     bne.b    .try_extres
  2196.     bsr.b    .find
  2197.     blo.b    .try_extres
  2198.  
  2199. .found    move.l    a1,d7
  2200.     addq.l    #1+3,d7
  2201.     and.w    #-4,d7
  2202.  
  2203. .exit    move.l    d7,d1
  2204.     sub.l    d6,d1
  2205.     move.l    d7,d0
  2206.     movem.l    (sp)+,d2-d3/d6-d7/a0-a2
  2207.     rts
  2208.  
  2209. .find    moveq    #-1,d2
  2210. .null    move.b    -(a1),d3
  2211.     addq.l    #1,d2
  2212.     not.b    d3
  2213.     beq.b    .null
  2214.     cmp.l    d1,d2
  2215.     rts
  2216.  
  2217. .required_extres
  2218.     neg.l    d1
  2219. .try_extres    move.l    (_erh_memheader,pc),d0
  2220.     beq.b    .exit
  2221.     move.l    d0,a0
  2222.     move.l    d1,d0
  2223.     move.l    a6,-(sp)
  2224.     move.l    (_ExecBase,pc),a6
  2225.     call    Allocate
  2226.     move.l    (sp)+,a6
  2227.     move.l    d0,d7
  2228.     moveq    #0,d6            NULL difference!
  2229.     bra.b    .exit
  2230.  
  2231.  
  2232. ;  IN: a0=resident
  2233. ;      a1=adr to "free" buf
  2234. ;      a2=adr to "free" buf (rom)
  2235. ;      d1.b=zero if <V36 ROM
  2236. PutResident    ;bsr    CacheClearOS        336r: Added coz bad move16 optimized copymem patches?
  2237.     movem.l    d0-a6,-(sp)
  2238.     move.l    (_ExecBase,pc),a6
  2239.     lea    (RT_MATCHTAG,a1),a3
  2240.     lea    (4,a1),a4
  2241.     move.l    (RT_ENDSKIP,a0),d0
  2242.     call    CopyMem
  2243.     ;bsr    CacheClearOS        336r: Added coz bad move16 optimized copymem patches?
  2244.     move.l    a2,d0
  2245.     move.l    d0,(a3)+        RT_MATCHTAG
  2246.     add.l    d0,(a3)+        RT_ENDSKIP
  2247.     tst.b    (4+3,sp)        V36+ ?
  2248.     bne.b    .no_incomp
  2249.     move.b    (a3),d1
  2250.     and.b    #~(RTF_AUTOINIT!RTW_COLDSTART),d1
  2251.     beq.b    .no_incomp
  2252.     and.b    #RTF_AUTOINIT!RTW_COLDSTART,(a3) Mask out incompatible bits
  2253.     or.b    #RTW_COLDSTART,(a3)
  2254. .no_incomp    move.b    (a3),d1
  2255.     addq.l    #RT_NAME-RT_FLAGS,a3
  2256.     add.l    d0,(a3)+        RT_NAME
  2257.     add.l    d0,(a3)+        RT_IDSTRING
  2258.     and.b    #RTF_AUTOINIT,d1
  2259.     beq.b    .noauto
  2260.     add.l    (a3),a4
  2261.     tst.l    (a4)+
  2262.     beq.b    .nop1
  2263.     add.l    d0,(-4,a4)
  2264. .nop1
  2265.     tst.l    (a4)+
  2266.     beq.b    .nop2
  2267.     add.l    d0,(-4,a4)
  2268. .nop2
  2269.     tst.l    (a4)+
  2270.     beq.b    .nop3
  2271.     add.l    d0,(-4,a4)
  2272. .nop3
  2273. .noauto    add.l    d0,(a3)+        RT_INIT
  2274.     movem.l    (sp)+,d0-a6
  2275.     rts
  2276.  
  2277.  
  2278. ;  IN: a0=rom (buf), d0=rom len, d1=required buffer len, d2=sanity size
  2279. ;      a6=execbase, d6=dosbase
  2280. ; OUT: d0=ptr to extres buffer or NULL
  2281. ExtResBuf    movem.l    d0-a6,-(sp)
  2282.     moveq    #0,d7
  2283.  
  2284.     move.l    d0,d5            d5=rom len
  2285.     move.l    a0,a5            a0=buf strt
  2286.  
  2287.     move.l    #ERROR_OBJECT_WRONG_TYPE,d1
  2288.     bsr    SetIoErr
  2289.  
  2290.     cmp.w    #37,($C,a5)        need 37+
  2291.     blo    .exit
  2292.  
  2293.     move.b    (_MemHeaderFlag,pc),d0
  2294.     beq    .exit
  2295.  
  2296.     ; find exec.library resident tag
  2297.  
  2298.     move.l    a5,a0
  2299.     move.l    d5,d0
  2300.     lea    (.execname,pc),a1
  2301.     bsr    FindResident
  2302.     tst.l    d0
  2303.     beq    .exit
  2304.  
  2305.     move.l    d0,a3
  2306.     move.l    (RT_INIT,a3),d1
  2307.  
  2308.     ;test if inside rom bounds?
  2309.     cmp.l    #$0f80000,d1
  2310.     blo    .exit
  2311.     cmp.l    #$1000000,d1
  2312.     bhs    .exit
  2313.  
  2314.     ; generate ram buffer address
  2315.     sub.l    #$f80000,d1        -$f80000
  2316.     add.l    a5,d1            +buffer
  2317.     move.l    d1,a0
  2318.  
  2319.     moveq    #12,d4            skip 12 bytes
  2320.     cmp.l    #$41F900DF,(a0)        37.x
  2321.     beq.b    .use12
  2322.     moveq    #4,d4            skip 4 bytes
  2323.     cmp.w    #$41FA,(a0)        39.x/40.x
  2324.     bne    .exit
  2325. .use12    add.l    (RT_INIT,a3),d4
  2326.  
  2327.     move.l    #extreshandler_SIZEOF+ERHANDLER_SIZEOF+8+MH_SIZE+7,d0
  2328.     add.l    (1*4,sp),d0        d1 from stack
  2329.     and.w    #-8,d0            align by 8
  2330.  
  2331.     ; use this to set up MH_UPPER, MH_FREE,
  2332.     ; MC_BYTES, ScanEnd...
  2333.     move.l    d0,d2
  2334.     sub.l    #extreshandler_SIZEOF,d2
  2335.  
  2336.     ; len for allocabs
  2337.     move.l    d0,d3
  2338.  
  2339.     ; add sanity just in case (something in boot could alloc
  2340.     ; MEMF_REVERSE overwriting us...)
  2341.     ;
  2342.     ; If user sees 80010000 alert he/she should increase
  2343.     ; SANITY
  2344.  
  2345.     add.l    #$90000,d0        add 576k... (internal sanity)
  2346.     add.l    (2*4,sp),d0        d2 from stack
  2347.  
  2348.     lea    (_erh_alloclen,pc),a0
  2349.     move.l    d0,(a0)
  2350.  
  2351.     call    Forbid
  2352.     lea    (_memhead,pc),a0
  2353.     bsr    FindMemHeader
  2354.     beq    .cantfind
  2355.     bsr    Allocate_REVERSE
  2356.     ;call    Allocate
  2357.     call    Permit
  2358.     lea    (_erh_freeaddr,pc),a0
  2359.     move.l    d0,(a0)
  2360.     beq    .exit
  2361.  
  2362.     move.l    d0,a2
  2363.     move.l    d0,a1
  2364.     addq.l    #8,a2            jump over two longs
  2365.  
  2366.     lea    (extreshandler,pc),a0
  2367.     moveq    #extreshandler_SIZEOF,d0
  2368.     call    CopyMem
  2369.  
  2370.     lea    (extreshandler_SIZEOF-8,a2),a0
  2371.     move.l    a0,d0
  2372.  
  2373.     lea    (_erh_memheader,pc),a1
  2374.     move.l    a0,(a1)
  2375.     lea    (MH_SIZE,a0),a1
  2376.     clr.l    (a0)+            LN_SUCC
  2377.     clr.l    (a0)+            LN_PRED
  2378.     move.w    #NT_MEMORY<<8,(a0)+    LN_TYPE, LN_PRI
  2379.     clr.l    (a0)+            LN_NAME
  2380.     clr.w    (a0)+            MH_ATTRIBUTES
  2381.     move.l    a1,(a0)+        MH_FIRST
  2382.     move.l    a1,(a0)+        MH_LOWER
  2383.     add.l    d2,d0            d0 = a1 - (MH_SIZE+8) + size
  2384.     move.l    d0,(a0)+        MH_UPPER
  2385.     moveq    #-(MH_SIZE+8),d0
  2386.     add.l    d2,d0
  2387.     move.l    d0,(a0)+        MH_FREE
  2388.     move.l    a0,d7
  2389.     clr.l    (a0)+            MC_NEXT
  2390.     move.l    d0,(a0)+        MC_BYTES
  2391.  
  2392.     subq.l    #8,d0
  2393.     moveq    #-1,d1
  2394. .fill    move.l    d1,(a0)+
  2395.     move.l    d1,(a0)+
  2396.     subq.l    #8,d0
  2397.     bne.b    .fill
  2398.  
  2399.  
  2400.     move.l    a2,d0
  2401.     lea    (allocpt+2,pc),a0
  2402.     subq.l    #8,d0
  2403.     move.l    d0,(a0)
  2404.     lea    (alloclen+2,pc),a0
  2405.     move.l    d3,(a0)
  2406.  
  2407.     move.l    d7,(scanstartoffs-8,a2)
  2408.     lea    (_erh_areastart,pc),a0
  2409.     move.l    d7,(a0)
  2410.     moveq    #-(MH_SIZE+8),d0
  2411.     add.l    d2,d0
  2412.     lea    (_erh_arealen,pc),a0
  2413.     move.l    d0,(a0)
  2414.     add.l    d7,d0
  2415.     move.l    d0,(scanendoffs-8,a2)
  2416.     move.l    d4,(jumpoffs-8,a2)
  2417.     move.l    a2,(RT_INIT,a3)
  2418.  
  2419.  
  2420.     move.l    a5,a0            a0=ptr to rom (buf)
  2421.     move.l    d5,d0            d0=rom len
  2422.     lea    (_erhandler_module,pc),a1
  2423.     bsr    InstallModule
  2424.     tst.l    d0
  2425.     bne.b    .exit
  2426.  
  2427.     bsr    FreeExtResBuf
  2428.     moveq    #0,d7
  2429.  
  2430.  
  2431. .exit    move.l    d7,d0
  2432.     addq.l    #4,sp
  2433.     movem.l    (sp)+,d1-a6
  2434.     rts
  2435.  
  2436. .cantfind    call    Permit
  2437.     bra.b    .exit
  2438.  
  2439.  
  2440. .execname    dc.b    'exec.library',0
  2441.     CNOP    0,2
  2442.  
  2443.     ; IN: a6=execbase
  2444. extreshandler    dc.l    0,0            don't trust 8 bytes we AllocAbs
  2445.  
  2446.     lea    (.areas,pc),a0
  2447.     dc.w    $4ef9
  2448. jumpoffs    EQU    *-extreshandler
  2449.     dc.l    $badc0de
  2450.  
  2451.  
  2452. .areas    dc.l    $0F80000
  2453.     dc.l    $1000000
  2454.     dc.l    $0F00000
  2455.     dc.l    $0F80000
  2456. scanstartoffs    EQU    *-extreshandler
  2457.     dc.l    $15c0ded
  2458. scanendoffs    EQU    *-extreshandler
  2459.     dc.l    $badd1e
  2460.     dc.l    -1
  2461.  
  2462. extreshandler_SIZEOF    EQU    (*-extreshandler+7)&-8
  2463.  
  2464.  
  2465.  
  2466.  
  2467. ;  IN: a0 = memHeader
  2468. ;      d0 = byteSize
  2469. ;      a6 = execbase
  2470. ; OUT: d0 = memoryBlock or null, z set/clr
  2471. Allocate_REVERSE
  2472.     jsr    (_LVOForbid,a6)
  2473.     move.l    (MH_FIRST,a0),d1
  2474.     beq.b    .fail
  2475.  
  2476.     sub.l    a1,a1            ; default
  2477.  
  2478.     ; find last MH that matches our requirements
  2479. .findfree_r    move.l    d1,a0
  2480.     cmp.l    (MC_BYTES,a0),d0
  2481.     bhi.b    .findskip_r
  2482.     move.l    a0,a1
  2483. .findskip_r    move.l    (a0),d1            ; MC_NEXT
  2484.     bne.b    .findfree_r
  2485.  
  2486.     ; found any?
  2487.     move.l    a1,d1
  2488.     beq.b    .fail
  2489.  
  2490.     ; allocate from it!
  2491.     move.l    (MC_BYTES,a1),d1
  2492.     sub.l    d0,d1
  2493.     and.w    #-MEM_BLOCKSIZE,d1
  2494.     add.l    d1,a1
  2495.     jsr    (_LVOAllocAbs,a6)
  2496.     jsr    (_LVOPermit,a6)
  2497.     tst.l    d0
  2498.     rts
  2499.  
  2500. .fail    jsr    (_LVOPermit,a6)
  2501.     moveq    #0,d0
  2502.     rts
  2503.  
  2504.  
  2505.  
  2506.     STRUCTURE BKERHSS,0
  2507.     STRUCT    BKERHSS_ss,SS_SIZE
  2508.     ULONG    BKERHSS_version
  2509.     UWORD    BKERHSS_unused0
  2510.     APTR    BKERHSS_memheader
  2511.     LABEL    BKERHSS_SIZEOF
  2512.  
  2513. _erhandler_module
  2514.  BK_MOD BKMF_SingleMode|BKMF_ExtResBuf,_erhandler_end,(RTF_COLDSTART)<<24!37<<16!NT_UNKNOWN<<8!104,_erh_name,_erh_name,_ERHandler
  2515. ;
  2516. ; IMPORTANT:
  2517. ; priority is after `diag init' resident that adds memory to system
  2518. ;
  2519.  
  2520.     ; d0=0, a0=0, a6=execbase
  2521. _ERHandler    ; reallocate EXTRESBUF
  2522. allocpt    lea    $deadc0de,a1
  2523. alloclen    move.l    #$cafecafe,d0
  2524.     call    AllocAbs
  2525.     tst.l    d0
  2526.     bne.b    .got
  2527.  
  2528.     ; die horribe death
  2529.     move.l    #AT_DeadEnd!AG_NoMemory,d7
  2530.     call    Alert
  2531. .got
  2532.  
  2533.     ; initialize EXTRES API...
  2534.  
  2535.     moveq    #BKERHSS_SIZEOF,d0
  2536.     moveq    #MEMF_ANY,d1
  2537.     call    AllocMem
  2538.     tst.l    d0
  2539.     beq.b    .nomem
  2540.  
  2541.     move.l    d0,-(sp)
  2542.     move.l    d0,a0
  2543.     call    InitSemaphore
  2544.     move.l    (sp)+,a1
  2545.     move.l    #ERH_API_V1,(BKERHSS_version,a1)
  2546.     clr.w    (BKERHSS_unused0,a1)
  2547.  
  2548.     ; must not optimize this!
  2549. _erh_memheader    EQU    *+2
  2550.     move.l    #0,(BKERHSS_memheader,a1)
  2551.  
  2552.     lea    (_erh_name,pc),a0
  2553.     move.l    a0,(LN_NAME,a1)
  2554.     move.b    #-120,(LN_PRI,a1)
  2555.  
  2556.     call    AddSemaphore
  2557. .nomem
  2558.     ; fall in!
  2559.     ;bsr.b    MoveChipHeader
  2560.     ;rts
  2561.  
  2562. ; Routines taken from FastExec 2.5 public domain source code by
  2563. ; Torbjörn A. Andersson. Modified by Harry Sintonen.
  2564. ******************************************************************************
  2565.  
  2566. MoveChipHeader    movem.l    d2/a2-a3,-(sp)
  2567.     call    Forbid
  2568.  
  2569. .loop0    move.l    (MemList,a6),d2
  2570.  
  2571. .loop1    move.l    d2,a2
  2572.     move.l    (a2),d2
  2573.     beq.b    .quit
  2574.  
  2575.     cmp.l    #$1000000,a2        ; address
  2576.     bhs.b    .loop1
  2577.  
  2578.     moveq    #MH_SIZE,d0
  2579.     moveq    #MEMF_PUBLIC!MEMF_FAST,d1
  2580.     call    AllocMem
  2581.     tst.l    d0
  2582.     beq.b    .quit
  2583.     move.l    d0,a3
  2584.  
  2585.     lea    (LN_TYPE,a2),a0        ; source
  2586.     lea    (LN_TYPE,a3),a1        ; dest
  2587.     moveq    #MH_SIZE-LN_TYPE,d0
  2588.     call    CopyMem
  2589.  
  2590.     lea    (MH_SIZE,a2),a0
  2591.     cmp.l    (MH_LOWER,a2),a0
  2592.     bne.b    .ok
  2593.     move.l    a2,(MH_LOWER,a3)
  2594. .ok
  2595.     move.l    a2,a1            ; node
  2596.     call    Remove
  2597.     lea    (MemList,a6),a0        ; list
  2598.     move.l    a3,a1            ; node
  2599.     call    Enqueue
  2600.  
  2601. ;    cmp.w    #36,(LIB_VERSION,a6)
  2602. ;    blo.b    .loop0
  2603.  
  2604.     move.l    a2,a1            ; memoryBlock
  2605.     moveq    #MH_SIZE,d0
  2606.  
  2607.     move.l    d0,d1
  2608.     add.l    a1,d1
  2609.     lea    (MemList,a6),a0
  2610. .floop    move.l    (a0),a0
  2611.     tst.l    (a0)
  2612.     beq.b    .fdone
  2613.     cmp.l    (MH_LOWER,a0),a1
  2614.     blo.b    .floop
  2615.     cmp.l    (MH_UPPER,a0),a1
  2616.     bhs.b    .floop
  2617.     cmp.l    (MH_UPPER,a0),d1
  2618.     bhi.b    .fdone
  2619.     call    FreeMem
  2620. .fdone    bra.b    .loop0
  2621.  
  2622. .quit    call    Permit
  2623.     movem.l    (sp)+,d2/a2-a3
  2624.     rts
  2625.  
  2626. _erh_name    dc.b    'EXTRES Handler',0
  2627.     CNOP    0,2
  2628. _erhandler_end
  2629. ERHANDLER_SIZEOF EQU    (*-_erhandler_module+7)&-8
  2630.  
  2631.  
  2632. CacheClearOS    movem.l    d0-d1/a0-a1/a6,-(sp)
  2633.     pea    (.cleanexit,pc)
  2634.     move.l    (_ExecBase,pc),a6
  2635.     cmp.w    #37,(LIB_VERSION,a6)
  2636.     blo.b    CacheClear
  2637.     jmp    (_LVOCacheClearU,a6)    OK! ;-)
  2638. .cleanexit    movem.l    (sp)+,d0-d1/a0-a1/a6
  2639.     rts
  2640. CacheClear    btst    #AFB_68020,(_AttnFlags+1,pc)
  2641.     beq.b    .no68020
  2642.     movem.l    a5/a6,-(sp)
  2643.     lea    (.cacheclrsv,pc),a5
  2644.     move.l    (_ExecBase,pc),a6
  2645.     call    Supervisor
  2646.     movem.l    (sp)+,a5/a6
  2647. .no68020    rts
  2648. .cacheclrsv    or.w    #$700,sr        Disable interrupts
  2649.     bsr.b    CacheClrS
  2650.     nop
  2651.     rte
  2652. CacheClrS    btst    #AFB_68040,(_AttnFlags+1,pc)
  2653.     beq.b    .not040
  2654.     CACHEFLUSH040
  2655.     rts
  2656. .not040    move.l    d0,-(sp)
  2657.     movec    cacr,d0
  2658.     or.w    #CACRF_ClearI!CACRF_ClearD,d0
  2659.     movec    d0,cacr
  2660.     move.l    (sp)+,d0
  2661.     rts
  2662.  
  2663.  
  2664.     IFGT    0
  2665. DisableCache    btst    #AFB_68020,(_AttnFlags+1,pc)
  2666.     beq.b    .no68020
  2667.     movem.l    a5/a6,-(sp)
  2668.     lea    (.discachesv,pc),a5
  2669.     move.l    (_ExecBase,pc),a6
  2670.     call    Supervisor
  2671.     movem.l    (sp)+,a5/a6
  2672. .no68020    rts
  2673. .discachesv    or.w    #$700,sr        Disable interrupts
  2674.     bsr.b    DisableCacheS
  2675.     nop
  2676.     rte
  2677.     ENDC
  2678.  
  2679. DisableCacheS    move.l    d0,-(sp)
  2680.     movec    cacr,d0
  2681.  
  2682.     btst    #AFB_68040,(_AttnFlags+1,pc)
  2683.     bne.b    .is040
  2684.  
  2685.     and.w    #~(CACRF_EnableI!CACRF_IBE!CACRF_EnableD!CACRF_DBE),d0
  2686.     or.w    #CACRF_ClearI!CACRF_ClearD,d0
  2687.     movec    d0,cacr
  2688.  
  2689.     move.l    (sp)+,d0
  2690.     rts
  2691.  
  2692. .is040
  2693.     BITDEF    CACR,HalfICache,13        ;060
  2694.     BITDEF    CACR,NoAllocateI,14        ;040/060
  2695.     BITDEF    CACR,EnableICache,15        ;040/060
  2696.     BITDEF    CACR,ClearUserBCache,21        ;060
  2697.     BITDEF    CACR,ClearAllBCache,22        ;060
  2698.     BITDEF    CACR,EnableBCache,23        ;060
  2699.     BITDEF    CACR,HalfDCache,27        ;060
  2700.     BITDEF    CACR,DisableCPUSHInv,28        ;060?
  2701.     BITDEF    CACR,EnableStoreBuffer,29    ;060
  2702.     BITDEF    CACR,NoAllocateD,30        ;040/060
  2703.     BITDEF    CACR,EnableDCache,31        ;040/060
  2704.  
  2705. CACRF_CachesOr040    EQU    CACRF_EnableDCache|CACRF_EnableICache
  2706. CACRF_CachesAnd040    EQU    CACRF_NoAllocateI|CACRF_NoAllocateD
  2707. CACRF_CachesOr060    EQU    CACRF_CachesOr040|CACRF_EnableStoreBuffer|CACRF_EnableBCache
  2708. CACRF_CachesAnd060    EQU    CACRF_CachesAnd040|CACRF_DisableCPUSHInv|CACRF_HalfICache|CACRF_HalfDCache
  2709.  
  2710.     BITDEF    PCR,EnableDebugFeatures,7    ;060
  2711.     BITDEF    PCR,DisableFPU,1        ;060
  2712.     BITDEF    PCR,EnableSuperScalar,0        ;060
  2713.  
  2714.     and.l    #~CACRF_CachesOr060,d0
  2715.     or.l    #CACRF_ClearAllBCache,d0
  2716.     movec    d0,cacr
  2717.     nop
  2718.  
  2719.     ; turn off 060 superscalar dispatch
  2720.     tst.b    (_AttnFlags+1,pc)
  2721.     bpl.b    .no060
  2722.     dc.w    $4E7A,$0808    movec    pcr,d0
  2723.     and.l    #PCRF_EnableDebugFeatures|PCRF_DisableFPU,d0
  2724.     dc.w    $4E7B,$0808    movec    d0,pcr
  2725.     nop
  2726. .no060
  2727.     CACHEFLUSH040
  2728.     move.l    (sp)+,d0
  2729.     rts
  2730.  
  2731. ; IN: a1=libname, d0=version, a6=execbase
  2732. FindLib    bsr.b    OpenLib
  2733.     beq.b    .exit
  2734.     move.l    d0,-(sp)
  2735.     move.l    d0,a1
  2736.     call    CloseLibrary
  2737.     move.l    (sp)+,d0
  2738. .exit    rts
  2739. ; IN: a1=libname, d0=version, a6=execbase
  2740. OpenLib    move.w    #_LVOOldOpenLibrary,d1
  2741.     cmp.w    #33,(LIB_VERSION,a6)
  2742.     blo.b    .oldol
  2743.     move.w    #_LVOOpenLibrary,d1
  2744. .oldol    jsr    0(a6,d1.w)
  2745.     tst.l    d0
  2746.     rts
  2747.  
  2748.  
  2749. ;  IN: a0=filename (d6=dosbase, _Printf)
  2750. ; OUT: a1=buffer, d0=buffer len, d1=file len
  2751.  
  2752. XPKLoad    movem.l    d2-d7/a2-a6,-(sp)
  2753.     move.l    a0,a3
  2754.     sub.l    a5,a5
  2755.     moveq    #0,d6
  2756.     moveq    #0,d7
  2757.  
  2758.     move.l    (4*4,sp),a6
  2759.     move.l    a3,d1
  2760. ;;    moveq    #ACCESS_READ,d2
  2761. ;;    call    Lock
  2762. ;;    move.l    d0,d1
  2763.     bsr    _lockread
  2764.  
  2765.     beq    .exit
  2766.     move.l    d1,-(sp)
  2767.     lea    (-(fib_SIZEOF+4),sp),sp
  2768.     move.l    sp,d2
  2769.     addq.l    #3,d2
  2770.     and.w    #-4,d2
  2771.     call    Examine
  2772.     move.l    d2,a0
  2773.     move.l    (fib_Size,a0),d3
  2774.     move.l    d0,d2
  2775.     lea    ((fib_SIZEOF+4),sp),sp
  2776.     move.l    (sp)+,d1
  2777.     call    UnLock
  2778.     tst.l    d2
  2779.     beq.b    .exit
  2780.  
  2781.     move.l    a3,d1
  2782.     move.l    #MODE_OLDFILE,d2
  2783.     call    Open
  2784.     move.l    d0,d5
  2785.     beq.b    .exit
  2786.  
  2787.     move.l    d5,d1
  2788.     subq.l    #4,sp
  2789.     move.l    sp,d2
  2790.     move.l    d3,-(sp)
  2791.     moveq    #4,d3
  2792.     call    Read
  2793.     move.l    (sp)+,d3
  2794.     move.l    (sp)+,d4
  2795.     subq.l    #4,d0
  2796.     bne.b    .exit
  2797.     move.l    d5,d1
  2798.     moveq    #0,d2
  2799.     move.l    d3,-(sp)
  2800.     moveq    #OFFSET_BEGINNING,d3
  2801.     call    Seek
  2802.     move.l    (sp)+,d3
  2803.     subq.l    #4,d0
  2804.     bne.b    .exit
  2805.     cmp.l    #'XPKF',d4
  2806.     beq.b    .tryxpk
  2807.  
  2808. .noxpk    move.l    (_ExecBase,pc),a6
  2809.     move.l    d3,d0
  2810.     moveq    #MEMF_PUBLIC,d1
  2811.     call    AllocMem
  2812.     move.l    (4*4,sp),a6
  2813.     move.l    d0,d2
  2814.     beq.b    .close
  2815.  
  2816.     move.l    d5,d1
  2817.     call    Read
  2818.     cmp.l    d0,d3
  2819.     bne.b    .free
  2820.  
  2821.     move.l    d3,d7
  2822.     move.l    d3,d6
  2823.     move.l    d2,a5
  2824.     bra.b    .close
  2825.  
  2826. .free    move.l    (_ExecBase,pc),a6
  2827.     move.l    d2,a1
  2828.     move.l    d3,d0
  2829.     call    FreeMem
  2830.     move.l    (4*4,sp),a6
  2831.  
  2832. .close    move.l    d5,d1
  2833.     call    Close
  2834.  
  2835. .exit    move.l    a5,a1
  2836.     move.l    d6,d0
  2837.     move.l    d7,d1
  2838.     movem.l    (sp)+,d2-d7/a2-a6
  2839.     rts
  2840.  
  2841.  
  2842. .tryxpk    move.l    (_ExecBase,pc),a6
  2843.     lea    (.xpkname,pc),a1
  2844.     moveq    #0,d0
  2845.     bsr    OpenLib
  2846.     beq    .noxpk
  2847.     move.l    d0,d2
  2848.  
  2849.     move.l    (4*4,sp),a6
  2850.     move.l    d5,d1
  2851.     call    Close
  2852.     exg    d2,a6
  2853.  
  2854. XPKERRSIZE    EQU    ((XPKERRMSGSIZE+1+3)&-4)
  2855.  
  2856.     lea    (-XPKERRSIZE,sp),sp
  2857.     move.l    sp,a4
  2858.     clr.l    -(sp)
  2859.     move.l    sp,d3
  2860.     clr.l    -(sp)
  2861.     move.l    sp,d4
  2862.     clr.l    -(sp)
  2863.     move.l    sp,d5
  2864.     clr.l    -(sp)
  2865.     moveq    #-1,d0
  2866.     move.l    d0,-(sp)
  2867.     pea    XPK_PassThru        Allow uncompressed file
  2868.     pea    MEMF_PUBLIC
  2869.     pea    XPK_OutMemType
  2870.     move.l    d5,-(sp)        buflen
  2871.     pea    XPK_GetOutBufLen
  2872.     move.l    d4,-(sp)        filelen
  2873.     pea    XPK_GetOutLen
  2874.     move.l    d3,-(sp)        outbuf
  2875.     pea    XPK_GetOutBuf
  2876.     move.l    a4,-(sp)        errbuf
  2877.     pea    XPK_GetError
  2878.     move.l    a3,-(sp)
  2879.     pea    XPK_InName
  2880.     move.l    sp,a0
  2881.     call    XpkUnpack
  2882.     move.l    d5,sp
  2883.  
  2884.     move.l    (sp)+,d6        d6=buflen
  2885.     move.l    (sp)+,d7        d7=filelen
  2886.     move.l    (sp)+,a5        a5=outbuf
  2887.  
  2888.     tst.l    d0
  2889.     beq.b    .allok
  2890.     ; a4=errbuf
  2891.     move.l    a4,a0
  2892. .finde    tst.b    (a0)+
  2893.     bne.b    .finde
  2894.     move.b    #10,(-1,a0)
  2895.     clr.b    (a0)
  2896.     move.l    a4,a0
  2897.     exg    d2,d6
  2898.     bsr    _Printf
  2899.     exg    d2,d6
  2900.  
  2901. .allok    lea    (XPKERRSIZE,sp),sp
  2902.  
  2903.     move.l    a6,a1
  2904.     move.l    (_ExecBase,pc),a6
  2905.     call    CloseLibrary
  2906.     bra    .exit
  2907.  
  2908.  
  2909. .xpkname    dc.b    'xpkmaster.library',0
  2910.     CNOP    0,2
  2911.  
  2912.  
  2913.  
  2914.  
  2915.  
  2916. ;  IN: a0=rom, d0=rom len
  2917. ; OUT: d0=success (number of patches done, or zero)
  2918. LastPatches    movem.l    d1-a6,-(sp)
  2919.     moveq    #0,d7
  2920.     move.l    a0,a6
  2921.     move.l    d0,d6
  2922.  
  2923. SUPERVISOR_NOREVERSE    SET    0
  2924.     IFNE    SUPERVISOR_NOREVERSE
  2925.     move.w    #2048/2-1,d0        during first 2k
  2926.     move.l    #$2D40003A,d1
  2927. .scan    addq.l    #2,a0
  2928.     cmp.l    (a0),d1
  2929.     dbeq    d0,.scan
  2930.     tst.w    d0
  2931.     bmi.b    .not0
  2932.     cmp.l    #$6608223C,(4,a0)
  2933.     bne.b    .scan
  2934.     cmp.l    #MEMF_CLEAR!MEMF_REVERSE,(8,a0)
  2935.     bne.b    .scan
  2936.     cmp.w    #$60EC,(12,a0)
  2937.     bne.b    .scan
  2938.  
  2939.     move.w    #MEMF_CLEAR>>16,(8,a0)
  2940.     addq.l    #1,d7
  2941. .not0
  2942.     ENDC
  2943.  
  2944.     move.l    (_OrigSum,pc),d5
  2945.     cmp.l    ROMSUMOFFS(a6,d6.l),d5
  2946.     bne    .not_correct_chksum
  2947.  
  2948.     cmp.l    #33<<16!180,($C,a6)
  2949.     bne.b    .not_33180
  2950.     cmp.l    #$56F2E2A6,d5        Must be original to patch!
  2951.     bne.b    .not_33180
  2952.  
  2953.     move.w    #$0020,($19C,a6)    2MB chip ram
  2954.     move.l    #$FF000001,($3000,a6)    ExecBase address mask
  2955.  
  2956.     IFGT    0
  2957.     move.l    #$20482249,d0        move.l a0,a0 / move.l a1,a1
  2958.     move.l    d0,($4D9A,a6)        expansion.library bug
  2959.     move.l    #$4EAEFF3A,($4D9A+4,a6)
  2960.     move.l    #$4A80672E,($4D9A+8,a6)
  2961.     move.l    #$24002200,($4D9A+12,a6)
  2962.     move.l    #$20434280,($4D9A+16,a6)
  2963.     move.l    #$302F0002,($4D9A+20,a6)
  2964.     move.w    d0,($4D9A+24,a6)
  2965.     ENDC
  2966.  
  2967.     move.l    #$20482249,d0        move.l a0,a0 / move.l a1,a1
  2968.     move.w    d0,($4D9A,a6)        expansion.library bug
  2969.     move.l    d0,($4D9A+2,a6)
  2970.     move.l    #$4A80672C,($4DA4,a6)
  2971.     move.l    #$24002240,($4DA4+4,a6)
  2972.     move.l    #$20437000,($4DA4+8,a6)
  2973.     move.b    #$30,($4DA4+12,a6)
  2974.  
  2975.     ; my:
  2976.     move.l    #$99CC4ED5,($1E6,a6)    no $C00000 mem, please !!
  2977. ;;    clr.b    ($56D,a6)        disable cache (instruction)
  2978.  
  2979.     addq.l    #1,d7
  2980. .not_33180
  2981.  
  2982.     cmp.l    #34<<16!5,($C,a6)
  2983.     bne.b    .not_3405
  2984.     cmp.l    #$15267DB3,d5        Must be original to patch!
  2985.     bne.b    .not_3405
  2986.  
  2987.     move.w    #$0020,($19C,a6)    2MB chip ram
  2988.     move.l    #$FF000001,($303C,a6)    ExecBase address mask
  2989.  
  2990.     addq.l    #1,d7
  2991. .not_3405
  2992.  
  2993. .not_correct_chksum
  2994.  
  2995.     move.l    d7,d0
  2996.     movem.l    (sp)+,d1-a6
  2997.     rts
  2998.  
  2999.  
  3000. ;  IN: a0=rom, d0=rom len
  3001. ; OUT: d0=success (number of patches done, or zero)
  3002. SpeedROM    movem.l    d1-a6,-(sp)
  3003.  
  3004.     moveq    #0,d7
  3005.     move.l    a0,a2
  3006.     move.l    d0,d4
  3007.     move.l    #$01000000,d2
  3008.     sub.l    d4,d2
  3009.     move.l    a2,a5
  3010.     sub.l    d2,a5            a5=difference
  3011.  
  3012.     move.l    (4,a2),a1
  3013.     add.l    a5,a1
  3014.  
  3015.     cmp.w    #$203C,(6,a1)        KS 1.x start: (34.5)
  3016.     bne.b    .nosp1
  3017.     cmp.l    #$53806EFC,(12,a1)
  3018.     bne.b    .nosp1
  3019.     move.w    #$6008,(6,a1)
  3020.     addq.l    #1,d7
  3021. .nosp1
  3022.     IFNE    HAVE_SPEEDROMCHECKSUM
  3023.     cmp.l    #$41F900F8,(4,a1)    KS 3.0 chksum:
  3024.     bne.b    .nosp2
  3025.     cmp.l    #$72FF7401,(10,a1)
  3026.     bne.b    .nosp2
  3027.     move.l    #$7AFF6010,(10,a1)
  3028.     addq.l    #1,d7
  3029. .nosp2
  3030.     cmp.l    #$41FAFF28,(4,a1)    KS 3.1 chksum:
  3031.     bne.b    .nosp3
  3032.     cmp.l    #$72FF7401,(8,a1)
  3033.     bne.b    .nosp3
  3034.     move.l    #$7AFF6010,(8,a1)
  3035.     addq.l    #1,d7
  3036. .nosp3
  3037.     ENDC
  3038.  
  3039.     ; Reconnect resident modules:
  3040.  
  3041.     moveq    #-(RT_SIZE+2),d1
  3042.     move.l    a2,a0
  3043.     add.l    d4,d1
  3044.     sub.l    a1,a1
  3045. .find    subq.l    #2,d1
  3046.     bls.b    .done
  3047.     cmp.w    #RTC_MATCHWORD,(a0)+
  3048.     bne.b    .find
  3049.     moveq    #2,d0
  3050.     add.l    (a0),d0            (RT_MATCHTAG-2,a0),d0
  3051.     add.l    a5,d0
  3052.     cmp.l    a0,d0
  3053.     bne.b    .find
  3054.     subq.l    #2,a0
  3055.     move.l    a1,d0
  3056.     beq.b    .is_1st
  3057.     move.l    a0,d0
  3058.     sub.l    a5,d0
  3059.     move.l    d0,(RT_ENDSKIP,a1)
  3060. .is_1st    move.l    a0,a1
  3061.     lea    (RT_SIZE,a0),a0
  3062.     bra.b    .find
  3063. .done
  3064.     move.l    a1,d0
  3065.     beq.b    .none
  3066.     ; make last RT_ENDSKIP point $FFFFFE
  3067.     move.l    #$FFFFFE,(RT_ENDSKIP,a1)
  3068. .none
  3069.  
  3070.     ; can't really reconnect EXTRES buffer restags
  3071.     ; ...
  3072.  
  3073.     addq.l    #1,d7
  3074.  
  3075.     move.l    d7,d0
  3076.     movem.l    (sp)+,d1-a6
  3077.     rts
  3078.  
  3079.  
  3080.     IFGT    0
  3081.  
  3082. ; *** WARNING: REQUIRES SOURCE AND DESTINATION ADDRESSES ALIGNEG BY 16! ***
  3083.  
  3084. ;  IN: a0=source ptr
  3085. ;      a1=dest ptr
  3086. ;      d0=copy len, aligned by 256
  3087. ; OUT: a0=source ptr + copy len
  3088. ;      a1=dest ptr + copy len
  3089. ;      d0=copy len
  3090. copymem256_040    move.l    d0,-(sp)
  3091.     lsr.l    #8,d0            /256
  3092. .copy    move16    (a0)+,(a1)+        16
  3093.     move16    (a0)+,(a1)+        16
  3094.     move16    (a0)+,(a1)+        16
  3095.     move16    (a0)+,(a1)+        16
  3096.  
  3097.     move16    (a0)+,(a1)+        16
  3098.     move16    (a0)+,(a1)+        16
  3099.     move16    (a0)+,(a1)+        16
  3100.     move16    (a0)+,(a1)+        16
  3101.  
  3102.     move16    (a0)+,(a1)+        16
  3103.     move16    (a0)+,(a1)+        16
  3104.     move16    (a0)+,(a1)+        16
  3105.     move16    (a0)+,(a1)+        16
  3106.  
  3107.     subq.l    #1,d0
  3108.     move16    (a0)+,(a1)+        16
  3109.     move16    (a0)+,(a1)+        16
  3110.     move16    (a0)+,(a1)+        16
  3111.     move16    (a0)+,(a1)+        16
  3112.     bne.b    .copy
  3113.     move.l    (sp)+,d0
  3114.     rts
  3115.  
  3116.     ENDC
  3117.  
  3118.  
  3119. ;  IN: a0=source ptr
  3120. ;      a1=dest ptr
  3121. ;      d0=copy len, aligned by 256
  3122. ; OUT: a0=source ptr + copy len
  3123. ;      a1=dest ptr + copy len
  3124. ;      d0=copy len
  3125. copymem256    movem.l    d0-d7/a2-a6,-(sp)
  3126.     lsr.l    #8,d0            /256
  3127. .copy    movem.l    (a0)+,d1-d7/a2-a6
  3128.     movem.l    d1-d7/a2-a6,(a1)    12*4=48
  3129.     movem.l    (a0)+,d1-d7/a2-a6
  3130.     movem.l    d1-d7/a2-a6,(1*48,a1)    12*4=48
  3131.     movem.l    (a0)+,d1-d7/a2-a6
  3132.     movem.l    d1-d7/a2-a6,(2*48,a1)    12*4=48
  3133.     movem.l    (a0)+,d1-d7/a2-a6
  3134.     movem.l    d1-d7/a2-a6,(3*48,a1)    12*4=48
  3135.     movem.l    (a0)+,d1-d7/a2-a6
  3136.     movem.l    d1-d7/a2-a6,(4*48,a1)    12*4=48
  3137.     movem.l    (a0)+,d1-d4
  3138.     movem.l    d1-d4,(5*48,a1)        4*4=16
  3139.     subq.l    #1,d0
  3140.     lea    (256,a1),a1
  3141.     bne.b    .copy
  3142.     movem.l    (sp)+,d0-d7/a2-a6
  3143.     rts
  3144.  
  3145.     ;IFGT    (copymem256_000-copymem256)-$7E
  3146.     ;FAIL    "copymem256 offset out of bra.b!"
  3147.     ;ENDC
  3148.  
  3149.  
  3150. ;  IN: a4=rom buffer
  3151. ;      d3=rom size
  3152. KickSys    ;illegal
  3153.  
  3154.     move.l    (_ExecBase,pc),a6
  3155.     lea    (GfxName,pc),a1
  3156.     moveq    #0,d0
  3157.     bsr    FindLib
  3158.     move.l    d0,a2
  3159.     exg    a2,a6
  3160.     sub.l    a1,a1
  3161.     call    LoadView
  3162.     call    WaitTOF
  3163.     cmp.w    #39,(LIB_VERSION,a6)
  3164.     blo.b    .noaga
  3165.     btst    #GFXB_AA_ALICE,(gb_ChipRevBits0,a6)
  3166.     beq.b    .noaga
  3167.     lea    $DFF106,a0
  3168.     move.w    #$0C00,(a0)        Reset AGA hardware.
  3169.     move.w    #$0000,($1FC-$106,a0)
  3170. .noaga    call    WaitTOF
  3171.     exg    a2,a6
  3172.  
  3173.     move.b    (_CPUCard,pc),d0
  3174.     bne    .mapcpucard
  3175.  
  3176.     lea    (.super,pc),a0
  3177.     bra    runnommu
  3178.  
  3179. .super    ori.w    #$700,sr        Disable all ints!
  3180.     bsr    CacheClrS        flush caches
  3181.  
  3182.     bset    #7,$DE0002        Set Gary Coldstart
  3183.  
  3184.     move.b    (_B20x0,pc),d0
  3185.     beq.b    .noB20x0a
  3186.     movec    dfc,d5
  3187.     moveq    #3,d0            Entry FC for Control Registers
  3188.     movec    d0,dfc
  3189.     moveq    #0,d1            Turn shadow off:
  3190.     bsr    SetMemShadowN
  3191. .noB20x0a
  3192.     move.b    (_CSPPC_MK3,pc),d0
  3193.     bne.b    .also_CSPPC_MK3
  3194.     move.b    (_BlizPPC,pc),d0
  3195.     beq.b    .no_blizppc1
  3196.     clr.b    $F60013            Turn off BlizPPC maprom
  3197. .also_CSPPC_MK3    nop
  3198.     nop
  3199.     move.b    #$10,$F60000        blizzppc/csppc/mkiii
  3200.     nop                majik
  3201.     nop
  3202. .no_blizppc1
  3203.     move.l    (_BlizROM,pc),a1
  3204.  
  3205.     cmp.l    #$40000,d3
  3206.     bne.b    .no1st
  3207.  
  3208.     move.l    d3,d0            Copy 256k:
  3209.     move.l    a4,a0
  3210.     bsr    copymem256
  3211. .no1st
  3212.     move.l    d3,d0            Copy ROM:
  3213.     move.l    a4,a0
  3214.     bsr    copymem256
  3215.  
  3216.     bsr    CacheClrS        flush caches
  3217.  
  3218.     move.b    (_B20x0,pc),d0
  3219.     beq.b    .noB20x0b
  3220.     moveq    #1,d1            Turn shadow back on:
  3221.     bsr    SetMemShadowN
  3222.     movec    d5,dfc
  3223.     bsr    _fullflush040
  3224. .noB20x0b
  3225.     bsr    DisableCacheS        Disable all caches.
  3226.  
  3227.     move.b    (_MK2,pc),d0
  3228.     beq.b    .no_mk2
  3229.     move.b    #$2A,$880000E3        Trigger MKII maprom
  3230.     nop
  3231.     bra.b    .doreset
  3232. .no_mk2
  3233.     move.b    (_CSPPC_MK3,pc),d0
  3234.     beq.b    .no_CSPPC_MK3
  3235.  
  3236.     move.l    (_tc,pc),d0        restore mmu state for
  3237.     movec    d0,tc            a while...
  3238.     nop
  3239.  
  3240.     lea    $00F60020,a0        Trigger PPC/MKIII maprom
  3241.     move.b    #$60,(a0)
  3242.     nop
  3243.     move.b    #$50,(a0)
  3244.     nop
  3245.     move.b    #$30,(a0)
  3246.     nop
  3247.     move.b    #1,(-8,a0)
  3248.     nop
  3249.     clr.b    (a0)
  3250.     bra.b    .also_CSPPC_MK3b
  3251. .no_CSPPC_MK3
  3252.     move.b    (_BlizPPC,pc),d0
  3253.     beq.b    .no_blizppc2
  3254.  
  3255.     move.l    (_tc,pc),d0        restore mmu state for
  3256.     movec    d0,tc            a while
  3257.     nop
  3258.  
  3259.     clr.b    $F60012            Trigger BlizPPC maprom
  3260. .also_CSPPC_MK3b
  3261.     nop
  3262.     nop
  3263.     move.b    #$40,$F60018        blizzppc/csppc/mkiii
  3264.     move.b    #$0C,$F60000        majik
  3265.     nop
  3266.     nop
  3267.  
  3268.     movec    tc,d0            disable MMU again
  3269.     and.w    #$7FFF,d0
  3270.     movec    d0,tc
  3271.     nop
  3272. .no_blizppc2
  3273.  
  3274. .doreset    move.l    #-1,(4).w        Trash execbase:
  3275.     bsr    CacheClrS        flush caches
  3276.  
  3277.     lea    $DFF09A,a0
  3278.     move.w    #$4000,(a0)+        All interrupts off
  3279.     move.w    #$3FFF,(a0)        All DMA off
  3280.  
  3281.     lea    $01000000+4,a0        ...and reboot...
  3282.     sub.l    (ROMSIZEOFFS-4,a0),a0
  3283.     move.l    (a0),a0
  3284.     subq.l    #2,a0
  3285.     IFGT    (*-Main)&2        Main must be longword aligned!
  3286.     move.l    a1,a1
  3287.     ENDC
  3288.     reset
  3289.     jmp    (a0)
  3290.  
  3291.  
  3292.  
  3293. .mapcpucard    call    Forbid            Must be V37+ if got here
  3294.     bsr.b    cachecontroli
  3295.  
  3296.     lea    (.nommucpuc,pc),a0
  3297.     bra    runnommu
  3298.  
  3299. .nommucpuc    ori.w    #$700,sr        Lock All Irqs
  3300.  
  3301.     clr.b    $DE0000            Gary bootflags=ColdStart
  3302.     clr.b    $DE0001
  3303.     nop
  3304.     move.l    #1,$80F80000        Trigger maprom
  3305.     nop
  3306.  
  3307.     lea    $07F80000,a1        Copy ROM Image
  3308.  
  3309.     move.l    #$40000,d3
  3310.     bne.b    .cpucno1st
  3311.  
  3312.     move.l    d3,d0            Copy 256k:
  3313.     move.l    a4,a0
  3314.     bsr    copymem256
  3315. .cpucno1st
  3316.     move.l    d3,d0            Copy ROM:
  3317.     move.l    a4,a0
  3318.     bsr    copymem256
  3319.  
  3320.     move.b    #$80,$DE0000        Gary BootFlag=ColdBoot
  3321.     move.b    #$80,$DE0001
  3322.  
  3323.     bra    .doreset
  3324.  
  3325.  
  3326. cachecontroli    moveq    #CACRF_EnableI!CACRF_IBE,d0
  3327. cachecontrol    move.l    #~CACRF_WriteAllocate,d1
  3328.     jmp    (_LVOCacheControl,a6)
  3329.  
  3330.  
  3331.     IFNE    HAVE_CHECKCPUCARD
  3332. ;  IN: -
  3333. ; OUT: d0,cc=nonzero if CPU Card with MAPROM present, else zero
  3334. CheckCPUCard    movem.l    d7/a6,-(sp)
  3335.     moveq    #0,d7
  3336.     move.l    (_ExecBase,pc),a6
  3337.     cmp.w    #37,(LIB_VERSION,a6)
  3338.     blo.b    .exit
  3339.     call    Forbid
  3340.  
  3341.     bsr.b    cachecontroli
  3342.     move.l    d0,-(sp)
  3343.  
  3344.     lea    (.nommu,pc),a0
  3345.     bsr    runnommu
  3346.     move.l    d0,d7
  3347.  
  3348.     move.l    (sp)+,d0
  3349.     bsr.b    cachecontrol
  3350.  
  3351.     call    Permit
  3352. .exit    move.l    d7,d0
  3353.     movem.l    (sp)+,d7/a6
  3354.     rts
  3355.  
  3356. .nommu    ori.w    #$700,sr        Lock All Irqs
  3357.     moveq    #0,d2
  3358.     clr.b    $DE0000            Gary bootflags=ColdStart
  3359.     clr.b    $DE0001
  3360.     nop
  3361.     move.l    #1,$80F80000        Trigger maprom
  3362.     nop
  3363.     move.l    $07F80000,d0        Test MAPROM
  3364.     cmp.l    $00F80000,d0
  3365.     bne.b    .nomap
  3366.     move.l    d0,d1            2nd test
  3367.     not.l    d1
  3368.     move.l    d1,$07F80000
  3369.     cmp.l    $F80000,d1
  3370.     beq.b    .does_map
  3371. .xit    move.l    d0,$07F80000
  3372. .nomap    move.b    #$80,$DE0000        Gary bootflags=Warmstart
  3373.     move.l    d2,d0
  3374.     rts
  3375.  
  3376. .does_map    moveq    #1,d2
  3377.     bra.b    .xit
  3378.     ENDC
  3379.  
  3380.  
  3381. _gettc    movec    tc,d0            $4e7a0003
  3382.     nop
  3383.     rte
  3384.  
  3385. morphosname    dc.b    'MorphOS',0
  3386. setpatchname    dc.b    '« SetPatch »',0
  3387. mmuname    dc.b    'mmu.library',0
  3388. DosName    dc.b    'dos.library',0
  3389. _mmuflag    EQU    *-1
  3390. GfxName    dc.b    'graphics.library',0
  3391.     dc.b    '$VER:'
  3392. _Version    dc.b    'BlizKick 1.23 (4.9.00)',0
  3393.     dc.b    '$COPYRIGHT:'
  3394. _Copyright    dc.b    'Copyright © 1996-2000 PitPlane Productions',0
  3395. _Template    dc.b    'KICKFILE,MODULE/M,EXTRESBUF/N,SANITY/K/N,FORCE/S,'
  3396.     dc.b    'SPEEDROM/S,HOGWAITBLIT/S,CPUCARD=CSMKI/S,QUIET/S',0
  3397. _13Help    dc.b    'Usage: BlizKick ',$9b,'1mKICKFILE',$9b,'0m',10
  3398.     dc.b    'KICKFILE is full path for the ROM image to kick.',10,0
  3399. _ks13error    dc.b    'DOS Error #%ld!',10,0
  3400.     IFD    HAVE_NEW_ENV_METHOD
  3401. _VarEnvArcName    dc.b    'ENVARC:'
  3402. _VarName    dc.b    'BKMODPATH',0
  3403.     ELSE
  3404. _EnvName    dc.b    'ENVx',0
  3405. _EnvArcName    dc.b    'ENVARC:',0
  3406. _VarName    dc.b    'BKMODPATH',0
  3407.     ENDC
  3408.  
  3409. RequiresBliz    dc.b    'BlizKick requires turbo board/CPU-card with MAPROM feature.',10,0
  3410. NoCPUCard    dc.b    'Couldn''t find CPU Card!',10,0
  3411. PlantError    dc.b    'Couldn''t plant module ''%s''!',10,0
  3412. Messu    dc.b    'Phase5 turbo board MapROM tool written by Harry "Piru" Sintonen.',10,0
  3413. Messu2    dc.b    'Kicking AMIGA ROM Operating System %d.%d.',10,0
  3414. Already    dc.b    'Kickstart is already kicked!',10,0
  3415. CouldNotKick    dc.b    'Couldn''t kick file ''%s''!',10,0
  3416. NoRem    dc.b    'Kickstart wasn''t kicked using BlizKick!',10,0
  3417. NoRestore    dc.b    'Kickstart restoring not supported!',10,0
  3418.  
  3419.  
  3420.     CNOP    0,4
  3421. _Self    ds.l    1
  3422. _ExecBase    ds.l    1
  3423. _mmubase    ds.l    1
  3424. _Array    ds.l    10
  3425. _BlizROM    ds.l    1
  3426. _Quiet    ds.l    1
  3427. _OrigSum    ds.l    1
  3428. _erh_alloclen    ds.l    1
  3429. _erh_freeaddr    ds.l    1
  3430. _erh_arealen    ds.l    1
  3431. _erh_areastart    ds.l    1
  3432. _tc    ds.l    1
  3433. _memhead    ds.b    MH_FIRST
  3434. _AttnFlags    ds.w    1
  3435. _MemHeaderFlag    ds.b    1
  3436. _B20x0    ds.b    1
  3437. _CPUCard    ds.b    1
  3438. _CSPPC_MK3    ds.b    1
  3439. _MK2    ds.b    1
  3440. _BlizPPC    ds.b    1
  3441.  
  3442. CODE_SIZEOF    EQU    (*-Main+7)&-8
  3443.  
  3444.     END
  3445.  
  3446.  
  3447. ; maprom not on:
  3448. ;
  3449. ; CS MKI     MH_UPPER & $80000 == 0
  3450. ; CS MKII    MH_UPPER & $80000 == 0
  3451. ; CS MKIII   MH_UPPER & $80000 == 0
  3452. ; CS PPC     MH_UPPER & $80000 != 0
  3453. ; BLIZZ PPC  MH_UPPER & $F0000 != 0
  3454. ;
  3455.  
  3456.  
  3457. ; model     id       mem     start     end        notes  maprom
  3458. ;turbo mem 2140/?    -        ?       - ?          A500
  3459. ; 1220     2140/0C   4 meg   $00200000-$00600000  A1200
  3460. ; 1230-I   2140/0?   ? meg   $????????-$????????  A1200  $????????
  3461. ; 1230-II  2140/0B   4 meg   $0E000000-$0E400000  A1200  $0FF80000 ! ??
  3462. ; 1230-II  2140/0B   8 meg   $????????-$????????  A1200  $1EF80000 ! ??
  3463. ; 1230-III 2140/0D   8 meg   $1DC00000-$1E400000  A1200  $1EF80000
  3464. ; 1230-III 2140/0D  32 meg   $1D000000-$1EF80000  A1200  $1EF80000
  3465. ; 1230-IV  2140/11   8 meg   $78000000-$78800000  A1200  $4FF80000
  3466. ; 1230-IV  2140/11   2 meg   $78000000-$78200000  A1200  $4FF80000?
  3467. ; 1230-IV  2140/11  16 meg   $68000000-$68F80000  A1200  $4FF80000?
  3468. ;?1260     2140/11   4 meg   $68000000-$68400000  A1200  $4FF80000 040&060 flag set!
  3469. ;>1260     2140/11   8 meg   $78000000-$78800000  A1200  $4FF80000 040&060 flag set!
  3470. ;?1260     2140/11  16 meg   $68000000-$69000000  A1200  $4FF80000 040&060 flag set!
  3471. ; 1260     2140/11   4 meg   $68000000-$68380000  A1200  $4FF80000? 040&060 flag set!
  3472. ; 1240-T   2140/11  16 meg   $68000000-$69000000  A1200  $4FF80000? 040 flag set!
  3473. ; 2040-ERC 2140/18   8 meg   $08000000-$08800000  A2000  $???????? 040 flag set!  'blizzard fastram'
  3474. ; 2060     2140/18  20 meg   $08000000-$09400000  A2000  $???????? 040&060 flag set!
  3475. ; 4030     2140/?    -        ?       - ?         A4000
  3476.  
  3477. ; CSMKI    2140/0C  32 meg   $08000000-$0A000000  A4000  csmagic  040 flag set
  3478. ; CSMKII   2140/19  80 meg   $08000000-$0D000000  A4000  csmagic
  3479. ; CS-PPC   2140/64   ? meg    ?       - ?         A4000 
  3480. ; BLIZPPC  2140/6E  16 meg   $68000000-$68800000  A1200  $FFF00000 040 flag set
  3481.  
  3482.  Board (unidentified):   Prod=8512/25($2140/$19) (@$EA0000 128K)
  3483.  Board (unidentified):   Prod=2092/18($82C/$12) (@$E90000 64K)
  3484.  Board (unidentified):   Prod=2167/201($877/$C9) (@$EC0000 64K)
  3485.  Board (unidentified):   Prod=8512/34($2140/$22) (@$40000000, size 64meg, subsize same)
  3486.  
  3487. last one is CV 64
  3488.  
  3489.  VERS:   Kickstart version 40.70, Exec version 40.10, Disk version 40.42
  3490.  RAM:    Node type $A, Attributes $505 (FAST), at $8000000-$CFFFFFF (80.0 meg)
  3491.  
  3492.  
  3493. *** CS MK I:
  3494.  
  3495. PROCESSOR:    CPU 68040/68882fpu
  3496. CUSTOM CHIPS:    AA PAL Alice (id=$0023), AA Lisa (id=$00F8)
  3497. VERS:    Kickstart version 39.106, Exec version 39.47, Disk version 39.29
  3498. RAM:    Node type $A, Attributes $505 (FAST), at $8000000-$9FFFFFF (32.0 meg)
  3499.     Node type $A, Attributes $703 (CHIP), at $2000-$1FFFFF (~2.0 meg)
  3500. BOARDS:
  3501. =======================================================================
  3502.  Board (unidentified):   Prod=2195/10($893/$A)
  3503.      (@$40000000, size 4meg, subsize same)
  3504.  ConfigDev structure found at location $27F8
  3505. ==== Board ID (ExpansionRom) information:
  3506. er_Manufacturer         =2195=$893=(~$F76C)
  3507. er_Product              =10=$A=(~$F5)
  3508. er_Type                 =$8F
  3509.   (type 2 (Zorro III), size 4meg, subsize same)
  3510.   (not for free list, no ROM diag vec, chained to next)
  3511. er_Flags                =$10
  3512.   (no space preference, can be shut up)
  3513. er_InitDiagVec          =$0
  3514. ==== Configuration (ConfigDev) information:
  3515. cd_BoardAddr            =$40000000
  3516. cd_BoardSize            =$1000000 (16384K)
  3517. cd_Flags                =$0  (CONFIGME bit cleared)
  3518. =======================================================================
  3519.  Board + ROM (HD?) (unidentified):   Prod=8512/12($2140/$C) (@$E90000 64K)
  3520.  ConfigDev structure found at location $2840
  3521. ==== Board ID (ExpansionRom) information:
  3522. er_Manufacturer         =8512=$2140=(~$DEBF)
  3523. er_Product              =12=$C=(~$F3)
  3524. er_Type                 =$D1
  3525.   (type 3, size 64K, not for free list, ROM diag vec valid, not chained)
  3526. er_Flags                =$0
  3527.   (no space preference, can be shut up)
  3528. er_InitDiagVec          =$80
  3529. DiagCopy at             =$8003320
  3530. ==== Configuration (ConfigDev) information:
  3531. cd_BoardAddr            =$E90000
  3532. cd_BoardSize            =$10000 (64K)
  3533. cd_Flags                =$0  (CONFIGME bit cleared)
  3534. =======================================================================
  3535.  Board + ROM (HD?) (unidentified):   Prod=2195/11($893/$B) (@$EA0000 64K)
  3536.  ConfigDev structure found at location $2888
  3537. ==== Board ID (ExpansionRom) information:
  3538. er_Manufacturer         =2195=$893=(~$F76C)
  3539. er_Product              =11=$B=(~$F4)
  3540. er_Type                 =$D1
  3541.   (type 3, size 64K, not for free list, ROM diag vec valid, not chained)
  3542. er_Flags                =$40
  3543.   (no space preference, can not be shut up)
  3544. er_InitDiagVec          =$0
  3545. ==== Configuration (ConfigDev) information:
  3546. cd_BoardAddr            =$EA0000
  3547. cd_BoardSize            =$10000 (64K)
  3548. cd_Flags                =$2  (CONFIGME bit still set)
  3549. =======================================================================
  3550.  Board (unidentified):   Prod=5000/1($1388/$1) (@$EB0000 64K)
  3551.  ConfigDev structure found at location $28D0
  3552. ==== Board ID (ExpansionRom) information:
  3553. er_Manufacturer         =5000=$1388=(~$EC77)
  3554. er_Product              =1=$1=(~$FE)
  3555. er_Type                 =$C1
  3556.   (type 3, size 64K, not for free list, no ROM diag vec, not chained)
  3557. er_Flags                =$40
  3558.   (no space preference, can not be shut up)
  3559. er_InitDiagVec          =$0
  3560. ==== Configuration (ConfigDev) information:
  3561. cd_BoardAddr            =$EB0000
  3562. cd_BoardSize            =$10000 (64K)
  3563. cd_Flags                =$0  (CONFIGME bit cleared)
  3564. =======================================================================
  3565.  Board + ROM (HD?) (unidentified):   Prod=2017/11($7E1/$B) (@$EC0000 64K)
  3566.  ConfigDev structure found at location $2918
  3567. ==== Board ID (ExpansionRom) information:
  3568. er_Manufacturer         =2017=$7E1=(~$F81E)
  3569. er_Product              =11=$B=(~$F4)
  3570. er_Type                 =$D1
  3571.   (type 3, size 64K, not for free list, ROM diag vec valid, not chained)
  3572. er_Flags                =$0
  3573.   (no space preference, can be shut up)
  3574. er_InitDiagVec          =$8000
  3575. ==== Configuration (ConfigDev) information:
  3576. cd_BoardAddr            =$EC0000
  3577. cd_BoardSize            =$10000 (64K)
  3578. cd_Flags                =$0  (CONFIGME bit cleared)
  3579. =======================================================================
  3580.  
  3581.  
  3582. ; Apollo:
  3583.  
  3584. ; 1230/28  2222/23   4 meg   $01C00000-02000000  A1200  none      030 flag set 'Apollo 32Bit Power'
  3585. ;                    8 meg   $03C00000-04400000 'Apollo 32Bit Power'
  3586. ; 1230/50  2222/23   4 meg   $01C00000-02000000  A1200  none      030 flag set 'Apollo 32Bit Power'
  3587. ; 1240/40  2222/23   4 meg   $01C00000-02000000  A1200  none      040 flag set '32Bit Power-Burstm'??
  3588. ; 1240     2222/23   8 meg   $01C00000-02400000  A1200  none      040 flag set '32Bit Power-Burstm'??
  3589. ; 1260     2222/23   4 meg   $01C00000-02000000  A1200  none      040&060 flag set '32Bit Power-Burstm'??
  3590. ; 4060     2222/23  32 meg   $08000000-0A000000  A4000  none      040&060 flag set 'Apollo 32Bit Power'
  3591.